Bootstrap

shell脚本:使用if-then语句和test命令

一、基本结构化命令if-then语句格式:

if  command
then
    command
fi

bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,then部分的命令就不会被执行。
fi语句用来表示if-then语句到此结束。

#! /bin/bash
if pwd
then
   echo "it worked one"
   echo "可以执行多条命令"
fi

执行结果:

it worked one
可以执行多条命令

二、if-then-else语句

if  command
then
    command
else
    command
fi

当if语句中的命令返回非零退出状态码时,会执行else部分中的命令。
else部分可以包含多条命令。

#! /bin/bash
if Iam; then
   echo "it worked two"
else ls
   echo "I am  in  the  else"
fi

执行结果:

./test1: line 9: Iam: command not found
test1
I am  in  the  else

三、嵌套if

bash shell会依次执行if语句,只有第一个返回退出状态码0的语句中的then部分会被执行

if  command
then
    command
elif command
then
    command
elif command
then 
    command
else
    command     
fi

四、test命令

if-then语句不能测试命令退出状态码之外的条件,test命令提供了在if-then语句中测试不同条件的途径。
如果test命令中列出的条件成立,test命令就会退出并返回状态码0。
test命令的格式非常简单:

test condition

condition是test命令要测试的一系列参数和值。当用在if-then语句中时,test命令看起来是这样的。

if test condition
then
    command
fi

另一种写法:

if [condition]
then
    command
fi

第一个方括号和第二个方括号之前必须加上一个空格,否则会报错
test命令可以判断三类条件:
数值比较
字符串比较
文件比较

  • 1)判断整数
      test 整数1 –eq 整数2 整数相等
      test 整数1 –ge 整数2 整数1大于等于整数2
      test 整数1 –gt 整数2 整数1大于整数2
      test 整数1 –le 整数2 整数1小于等于整数2
      test 整数1 –lt 整数2 整数1小于整数2
      test 整数1 –ne 整数2 整数1不等于整数2
#! /bin/bash
value1=10
value2=12
if [ $value1 -gt 12 ]
then
   echo "$value1 大于 12"
elif [ $value1 -eq $value2 ]
then
   echo "$value1 等于 $value2"
else
   echo "$value1 小于 12"
fi

执行结果:

10 小于 12

但是涉及到浮点值时,数值条件测试会有一个限制。bash shell只能处理整数。

  • 2)判断字符串

      test –n str1 str1的长度非零
      test –z str1 str1的长度为零
      test str1=str2 字符串相等
      test str1!=str2 字符串不等
      test str1 > str2 检查str1是否比str2大
      test str1 < str2 检查str1是否比str2小

记住,在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内。

-n和-z可以检查一个变量是否含有数据。

大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名;
大于和小于顺序和sort命令所采用的不同。

#! /bin/bash
value1=test
value2=Test
if [ $value1 \> $value2 ]
then
   echo "$value1 大于 $value2"
elif [ $value1 \< $value2 ]
then
   echo "$value1 小于 $value2"
else
   echo "$value1 等于 $value2"
fi

执行结果:

test 大于 Test

sort test file
执行结果:(小到大排序)

test
Test

比较测试中时使用的是标准的ASCII顺序,sort使用的是系统本地化语言设置中定义的排序顺序。

  • 3)判断文件

      test File1 –ef File2 两个文件具有同样的设备号和i结点号
      test File1 –nt File2 文件1比文件2 新
      test File1 –ot File2 文件1比文件2 旧
      test –b File 文件存在并且是块设备文件
      test –c File 文件存在并且是字符设备文件
      test –d File 文件存在并且是目录
      test –e File 文件存在
      test –f File 文件存在并且是正规文件
      test –g File 文件存在并且是设置了组ID
      test –G File 文件存在并且属于有效组ID
      test –h File 文件存在并且是一个符号链接(同-L)
      test –k File 文件存在并且设置了sticky位
      test –b File 文件存在并且是块设备文件
      test –L File 文件存在并且是一个符号链接(同-h)
      test –o File 文件存在并且属于有效用户ID
      test –p File 文件存在并且是一个命名管道
      test –r File 文件存在并且可读
      test –s File 文件存在并且是一个套接字
      test –t FD 文件描述符是在一个终端打开的
      test –u File 文件存在并且设置了它的set-user-id位
      test –w File 文件存在并且可写
      test –x File 文件存在并且可执行

五、复合条件测试

if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用:
1)[ condition1 ]&&[ condition1 ] 必须都满足
2)[ condition1 ] || [ condition1 ] 满足一种即可

#! /bin/bash
var1=10
var2=18
if [ $var1 -gt 15 ]&&[ $var2 -gt 15 ]; then
   echo "都满足条件"
elif [ $var1 -gt 15 ]||[ $var2 -gt 15 ]; then
   echo "其中一个满足条件"
else 
   echo "都不满足!"
fi

执行结果:

其中一个满足条件

六、if-then的高级特性

1)用于数学表达式的双括号 ((expression))
2)用于高级字符串处理功能的双方括号 [[ expression ]]

  • 使用双括号
    双括号的命令格式如下:
((expression))

expression可以是任意的数学赋值或比较表达式。
2.特点:
(1)在双括号结构中,所有表达式可以像c语言一样,如:a++,b–等。
(2)在双括号结构中,所有变量可以不加入:“$”符号前缀
(3)双括号可以进行逻辑运算,四则运算
(4)双括号结构 扩展了for,while,if条件测试运算
(5)支持多个表达式运算,各个表达式之间用“,”分开
(6)不需要将双括号中表达式里的判断符号转义

#! /bin/bash
var1=10
if((var1*2>$var1)); then
  ((var2 = $var1*2))
  echo "the  var2  is $var2"
fi

执行结果:

the  var2  is 20

注意,引用变量可以加$符号也可以不加;

七、case命令

 case  var in  pattern1 | pattern2)
     command1;;
     pattern3 )
     command2;;
     *) 
     commands;;
esac

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令
案例:

#! /bin/bash

echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
    1|2)  echo 'You select 1 or 2'
    ;;
    3)  echo 'You select 3'
    ;;
    4)  echo 'You select 4'
    ;;
    *)  echo 'You do not select a number between 1 to 4'
    ;;
esac

执行结果:

LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
1
You select 1 or 2
LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
3
You select 3
LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
4
You select 4
LSCNM597976:if-then qxr4383$ ./test5
Input a number between 1 to 4
Your number is:\c
5
You do not select a number between 1 to 4
;