shell 命令学习

147 阅读3分钟

基本用法

#!/bin/bash
#!/bin/bash

###################1
# last 文件包含 不需要再设置权限
# 1. ./test1.sh
# 2 source ./test1.sh

##################2
# 1.定义变量
my_name="hjq"
echo $my_name
echo ${my_name}
# 2.readonly 设置为只读 后面不允许再修改
readonly name
# 3.unset 变量删除 后面不允许再使用
unset name1
# 4.shell 字符串
# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
# 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
my_name1='hjq1'
echo $my_name1
# 5.字符串拼接
echo "hello,${my_name1}!"
# 6.字符串长度 #
echo ${#my_name1}
# 7.字符串截取 从某个范围到某个范围
echo ${my_name1:1:4}
# 8.字符串查找查找j或q所在的位置 反引号
echo `expr index ${my_name} jq` # 2

#####################3
# shell 数组 格式 数组名={值1 值2 ...值n}
nameArray={"hjq""hjq1"}
arrayLength=${#nameArray[@]} # 打印数组的长度

####################4
# shell 的注释 用 #
#####  我是注释的内容 #####

###################5
# shell 传递参数
echo "shell 传递参数的实例!"
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数: $#"

for i in "$*"; do {
	echo $i
}
done 

for i in "$@"; do {
	echo $i
}
done

############6
# shell 运算符
# 1.算数运算符 
# 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
# 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
value=`expr 2 \* 2`
echo "两数之和:${value} " # 4
# 2.关系运算符
# -eq 	检测两个数是否相等,相等返回 true。 	[ $a -eq $b ] 返回 false。
# -ne 	检测两个数是否相等,不相等返回 true。 	[ $a -ne $b ] 返回 true。
# -gt 	检测左边的数是否大于右边的,如果是,则返回 true。 	[ $a -gt $b ] 返回 false。
# -lt 	检测左边的数是否小于右边的,如果是,则返回 true。 	[ $a -lt $b ] 返回 true。
# -ge 	检测左边的数是否大于等于右边的,如果是,则返回 true。 	[ $a -ge $b ] 返回 false。
# -le 	检测左边的数是否小于等于右边的,如果是,则返回 true。 	[ $a -le $b ] 返回 true。
a="hjq"
b="hjq"

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi

shell 的运算符

#!/bin/bash

############6
# shell 运算符
# 1.算数运算符 
# 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
# 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
value=`expr 2 \* 2`
echo "两数之和:${value} " # 4
# 2.关系运算符 只能比较integer的类型
# -eq 	检测两个数是否相等,相等返回 true。 	[ $a -eq $b ] 返回 false。
# -ne 	检测两个数是否相等,不相等返回 true。 	[ $a -ne $b ] 返回 true。
# -gt 	检测左边的数是否大于右边的,如果是,则返回 true。 	[ $a -gt $b ] 返回 false。
# -lt 	检测左边的数是否小于右边的,如果是,则返回 true。 	[ $a -lt $b ] 返回 true。
# -ge 	检测左边的数是否大于等于右边的,如果是,则返回 true。 	[ $a -ge $b ] 返回 false。
# -le 	检测左边的数是否小于等于右边的,如果是,则返回 true。 	[ $a -le $b ] 返回 true。
name22=10
name23=10
if [ $name22 -eq $name23 ]
then
	echo "不相等"
else 
	echo "相等"
fi

# 3.布尔运算符
a="hjq"
b="hjq"

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi

# 4.逻辑运算符 && || 书写的格式要注意
# && 	逻辑的 AND 	[[ $a -lt 100 && $b -gt 100 ]] 返回 false
# || 	逻辑的 OR 	[[ $a -lt 100 || $b -gt 100 ]] 返回 true
a1=10
b1=20
if [[ $a1 -lt 100 && $b1 -gt 100 ]]
then
	echo "条件成立"
else
	echo "条件不成立"
fi

# 5.字符串运算
# = 	检测两个字符串是否相等,相等返回 true。 	[ $a = $b ] 返回 false。
# != 	检测两个字符串是否相等,不相等返回 true。 	[ $a != $b ] 返回 true。
# -z 	检测字符串长度是否为0,为0返回 true。 	[ -z $a ] 返回 false。
# -n 	检测字符串长度是否为0,不为0返回 true。 	[ -n $a ] 返回 true。
# str 	检测字符串是否为空,不为空返回 true。 	[ $a ] 返回 true。

a2="abc"
b2="efg"

if [ $a2 = $b2 ]
then
   echo "$a2 = $b2 : a 等于 b"
else
   echo "$a2 = $b2: a 不等于 b"
fi

# 6.文件测试运算符
# -b file 	检测文件是否是块设备文件,如果是,则返回 true。 	[ -b $file ] 返回 false。
# -c file 	检测文件是否是字符设备文件,如果是,则返回 true。 	[ -c $file ] 返回 false。
# -d file 	检测文件是否是目录,如果是,则返回 true。 	[ -d $file ] 返回 false。
# -f file 	检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 	[ -f $file ] 返回 true。
# -g file 	检测文件是否设置了 SGID 位,如果是,则返回 true。 	[ -g $file ] 返回 false。
# -k file 	检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 	[ -k $file ] 返回 false。
# -p file 	检测文件是否是有名管道,如果是,则返回 true。 	[ -p $file ] 返回 false。
# -u file 	检测文件是否设置了 SUID 位,如果是,则返回 true。 	[ -u $file ] 返回 false。
# -r file 	检测文件是否可读,如果是,则返回 true。 	[ -r $file ] 返回 true。
# -w file 	检测文件是否可写,如果是,则返回 true。 	[ -w $file ] 返回 true。
# -x file 	检测文件是否可执行,如果是,则返回 true。 	[ -x $file ] 返回 true。
# -s file 	检测文件是否为空(文件大小是否大于0),不为空返回 true。 	[ -s $file ] 返回 true。
# -e file 	检测文件(包括目录)是否存在,如果是,则返回 true。

# 变量 file 表示文件"/var/www/runoob/test.sh",它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:
file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi

检查库是否有更新eg:

#!/bin/bash
oriPodLockName="Podfile.lock"
oriPodsDIR="Pods"
backPodLockName="backPodfile.lock"
backPodsDIR="backPodsDIR"
logFile=`date "+%Y_%m_%d_%H_%M_%S"`
logFile="${logFile}PodErrMsg.txt"
currentDIR=`pwd`
currentworkSpace=""
backworkSpaceDIR="backworkSpaceDIR.xcworkspace"
diffchangeFile=`date "+%Y_%m_%d_%H_%M_%S"`
diffchangeFile="${diffchangeFile}diffChange.txt"
function getcurrentWorkSpace() {
  workspacePostFix=".xcworkspace"
  for file_a in ${currentDIR}/*
  do
    result=$(echo $file_a | grep "${workspacePostFix}")
    if [[ "$result" != "" ]]
    then
      currentworkSpace=$result
    fi
  done
}
getcurrentWorkSpace

function beforePod() {

  #先复制一份原始的lock文件 和 Pods文件夹
  echo "正在备份资源"
  cp  ${oriPodLockName} ${backPodLockName}  >> ${logFile}
  cp -a ${oriPodsDIR}   ${backPodsDIR}  >> ${logFile}
  cp -a ${currentworkSpace} ${backworkSpaceDIR} >> ${logFile}
}
function afterPod() {
  echo "资源后续清理"
  rm ${backPodLockName}  >> ${logFile}
  rm -rf ${backPodsDIR} >> ${logFile}
  rm -rf ${backworkSpaceDIR} >> ${logFile}
}
function recoverPod() {
  echo "正在恢复原始文件"
  mv -f ${backPodLockName} ${oriPodLockName}

  rm -rf ${oriPodsDIR} >> ${logFile}
  cp -a ${backPodsDIR}   ${oriPodsDIR}  >> ${logFile}
  rm -rf ${backPodsDIR} >> ${logFile}
  # mv -f ${backPodsDIR} ${oriPodsDIR}
  rm -rf ${currentworkSpace} >> ${logFile}
  cp -a ${backworkSpaceDIR}   ${currentworkSpace}  >> ${logFile}
  rm -rf ${backworkSpaceDIR} >> ${logFile}

}
function diffchange() {
  echo "-------------------------------当前发生变更的pod库---------------------------------" >> ${diffchangeFile}
  echo "--------------------------------------------------------------------------------" >> ${diffchangeFile}
  for (( i = 0; i < 3; i++ )); do
    echo ""
  done
  ### something
  diff ${oriPodLockName} ${backPodLockName}  -H >> ${diffchangeFile}
  echo "-----------------------------当前发生变更的第三方文件统计----------------------------" >> ${diffchangeFile}
  echo "--------------------------------------------------------------------------------" >> ${diffchangeFile}
  for (( i = 0; i < 3; i++ )); do
    echo ""
  done
  diff ${backPodsDIR} ${oriPodsDIR} -r -B -a | diffstat >> ${diffchangeFile}


  echo "-------------------------当前发生变更的第三方文件变化详细统计-------------------------" >> ${diffchangeFile}
  echo "--------------------------------------------------------------------------------" >> ${diffchangeFile}
  for (( i = 0; i < 3; i++ )); do
    echo ""
  done
  diff ${backPodsDIR} ${oriPodsDIR} -r -B -b >> ${diffchangeFile}

  open -a Atom     ${diffchangeFile}

  if [  $? != 0 ]
  then
    open -a Xcode ${diffchangeFile}
  fi

  if [  $? != 0 ]
  then
    open  ${diffchangeFile}
  fi

}
function install() {

  echo "请输入Pod command 相关参数 "
  echo "1 : install"
  echo "2 : update"
  echo "3 : install --verbose --no-repo-update"
  echo "4 : update --verbose --no-repo-update"
  echo "5 : 自定义参数"
  podcommandParam="install"
  while  read podCommandInputParam
  do
    case ${podCommandInputParam} in
      1)
      podcommandParam="install"
      break
      ;;
      2)
      podcommandParam="update"
      break
      ;;
      3)
      podcommandParam="install --verbose --no-repo-update"
      break
      ;;
      4)
      podcommandParam="update --verbose --no-repo-update"
      break
      ;;
      5)
      echo "请输入自定义参数"
      read podcommandParam
      break
      ;;
      *)
      echo "输入有错请重新输入"
      ;;
    esac

  done


  echo "您选择的是-------${podcommandParam}"
  beforePod
  echo "正在使用Pod命令"

  pod ${podcommandParam} 2>> ${logFile}
  if [ $? != 0  ]
  then
    recoverPod
    echo "Pod 命令执行失败 请检查是错误信息"
    open  ${logFile}
    exit 1
  fi

  diffchange

  afterPod
}


install