Skip to content

3-1.比较运算

  • 算数运算符

    • + 加法
    • - 减法
    • * 乘法
    • / 除法
    • % 取余
    • = 赋值
    • == 相等。用于比较两个数字,相等则返回 true
    • != 不相等。用于比较两个数字,不相同则返回 true
    • 注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
  • 关系运算符

    • -eq 等于
    • -gt 大于
    • -lt 小于
    • -ge 大于或等于
    • -le 小于或等于
    • -ne 不等于
  • 布尔运算符

    • -o 或运算。有一个表达式为 true 则返回 true[ $a -lt 20 -o $b -gt 100 ] 返回 true
    • -a 且运算。两个表达式都为 true 才返回 true[ $a -lt 20 -a $b -gt 100 ] 返回 false
    • ! 非运算。表达式为 true 则返回 false,否则返回 true[ ! false ] 返回 true
  • 逻辑运算符

    • && 逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
    • || 逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true

    TIP

    逻辑运算符与布尔运算符,看上去一样。但是它俩有两点区别:

    • 使用逻辑运算符需要加上 [[双大括号]],布尔运算符只需要 [单大括号]
    • 逻辑运算符具有特殊的短路功能,可以利用短路特性来实现使用 cmd1 的执行结果控制 cmd2 是否执行的效果。
  • 字符串运算符

    • = 检测两个字符串是否相等,相等返回 true
    • != 检测两个字符串是否不相等,不相等返回 true
    • -z 检测字符串长度是否为 0,为 0 返回 true
    • -n 检测字符串长度是否不为 0,不为 0 返回 true
    • $ 检测字符串是否为空,不为空返回 true
  • 文件测试运算符

    • -b file 检测文件是否是块设备文件,如果是,则返回 true
    • -c file 检测文件是否是字符设备文件,如果是,则返回 true
    • -d file 检测文件是否是目录,如果是,则返回 true
    • -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
    • -r file 检测文件是否可读,如果是,则返回 true
    • -w file 检测文件是否可写,如果是,则返回 true
    • -x file 检测文件是否可执行,如果是,则返回 true
    • -s file 检测文件是否为空(文件大小是否大于 0 ),不为空返回 true
    • -e file 检测文件(包括目录)是否存在,如果是,则返回 true

TIP

  • shell 中,每个语句执行完后,都会返回一个状态码,取值在 [0 - 255] 区间内。如果是 0 的话,表示语句执行结果是 true, 否则是 false。通常可用 $? 来访问该状态码。
  • test 命令是 shell 环境中用于测试条件表达式的工具。结合上一条,我们就可以判断测试语句的结果:
    shell
    test 2 -lt 2
    #因为2不小于2 所以结果是false。将会打印除0以外的数字:
    echo $?

3-2.判断语句

下述判断语句中的中括号 [] 也可以使用 test 命令来代替。看个人习惯。

  • if ... fi

    shell
    if [ expression ]
    then
      #Statements to be executed if expression is true
    fi

    也可以写成:

    shell
    if [ expression ]; then
      #Statements to be executed if expression is true
    fi

    TIP

    • expression 与中括号 [] 之间需要有空格。
    • ifthen 写在同一行的话,需要用分号 ; 来分隔。
  • if ... else ... fi

    shell
    if [ expression ]
    then
      #Statements to be executed if expression is true
    else
      #Statements to be executed if expression is not true
    fi
  • if ... elif ... fi

    shell
    if [ expression1 ] 
    then
      #Statements to be executed if expression1 is true
    elif [ expression2 ]
    then
      #Statements to be executed if expression2 is true
    elif [ expression3 ]
    then
      #Statements to be executed if expression3 is true
    fi

3-3.循环语句

循环语句分为3种。分别为 forwhileuntil

  • for 循环。

    shell
    arr=('v1' 'v2' 'v3')
    #这里应该使用${arr[*]} 读取到数组中的所有值
    for variable in ${arr[*]}
    do
      echo ${variable}
    done
  • while 循环

    shell
    num=1
    #(()) 可用于数学计算
    while ((${num} <= 5))
    do
      echo ${num}
      let "num++"
    done

    也可以写作:

    shell
    num=1
    #利用判断表达式 中括号或者test
    while [ ${num} -le 5 ]
    do
      echo ${num}
      let "num++"
    done

    let 命令有异议的话,可见链接

  • until 循环

    until 循环执行一系列命令直至条件为 true 时停止。

    until 循环与 while 循环在处理方式上刚好相反。

    一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

    shell
    #打印数字 知道该数字大于等于5
    num=0
    until [ ${num} -ge 5 ]
    do
      echo ${num}
      let num++
    done

3-4.函数

Shell 中也有函数的概念。基本形式如下:

shell
#function前缀可省略
function fun() {
  echo "this is a shell function"
  #获取函数传参
  echo $1
  #获取10位及10位以后的传参
  echo ${10}
  #返回值如果设定的话 只能在0-255之间 即使超过也会默认以0-255循环
  return 125
}
#注意调用的时候不用带小括号()
fun
#利用$?可获取函数返回值
echo $?
#如果要传参的话 如下:
fun 1 2 3 4 5 6 7 8 10

总结下:

  • 可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。
  • 参数返回,可以显示加 return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)
  • 函数参数相关如下:
    • ${n} 用来获取第 n 位的参数。
    • $# 用来获取参数的总个数。
    • $* 用来获取所有的参数。
    • $? 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。