HomeLINUXshell脚本-结构化命令-条件

shell脚本-结构化命令-条件

结构化命令

2.1 if-then-else语句
格式一:
if command 
then 
    commands 
fi

格式二:
if command; then 
 commands 
fi

格式三:
if command 
then
    commands 
else
    commands 
fi

格式四:
if command1 
then
    command set 1 
elif 
    command2 
then
    command set 2
[...]
fi
  • if语句会运行if后面的那个命令,如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,else部分的命令就会被执行或继续执行脚本中的下一个命令。
    fi语句用来表示if语句到此结束。

  • 在then或else部分,可以列出多条命令。bash shell会将这些命令当成一个块,都会被执行。


2.2 test命令
格式一:
if test condition 
then 
    commands 
fi

格式二:
if [ condition ] 
then 
    commands 
fi
  • if-then语句是不能测试命令退出状态码之外的条件;
  • test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立, test命令就会退出并返回退出状态码0。这样if-then语句就与其他编程语言中的if-then语句 以类似的方式工作了;
  • 注意,第一个方括号之后和第二个方括号之前必须加上一个空格, 否则就会报错。

test命令可以判断三类条件:
1. 数值比较
2. 字符串比较
3. 文件比较

2.2.1 数值比较
比较 描述
n1 -eq n2 检查n1是否与n2相等
n1 -ge n2 检查n1是否大于或等于n2
n1 -gt n2 检查n1是否大于n2
n1 -le n2 检查n1是否小于或等于n2
n1 -lt n2 检查n1是否小于n2
n1 -ne n2 检查n1是否不等于n2
  • 数值条件测试可以用在数字和变量上,数值只能处理整数
#!/bin/bash
val=8.8
if [ $val -gt 8 ]
then
    echo 'This is normal'
else
    echo 'throw exception'
fi

$ bash basic.sh
basic.sh: line 3: [: 8.8: integer expression expected
throw exception
2.2.2 字符串比较
比较 描述
str1 = str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否比str2大
-n str1 检查str1的长度是否非0
-z str1 检查str1的长度是否为0
  • 在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内;
  • 在比较字符串大小时注意:第一:大于号和小于号必须转义, 否则shell会把它们当作重定向符号, 把字符串值当作文件 名; 第二:大于和小于顺序和sort命令所采用的不同。
#!/bin/bash
# testing string sort order 
val1=Testing 
val2=testing
if [ $val1 \> $val2 ] 
then
    echo "$val1 is greater than $val2" 
else
    echo "$val1 is less than $val2" 
fi

$ bash basic.sh
Testing is less than testing
  • 在比较测试中,大写字母被认为是小于小写字母的,与sort命令恰好相反,比较测试中使用的是标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果。sort 命令使用的是系统的本地化语言设置中定义的排序顺序。对于英语,本地化设置指定了在排序顺 序中小写字母出现在大写字母前。

  • 空的和未初始化的变量会对shell脚本测试造成灾难性的影响。如果不是很确定一个变量的 内容,最好在将其用于数值或字符串比较之前先通过 -n 或 -z 来测试一下变量是否含有值。

2.2.3 文件比较
比较 描述
-d file 检查file是否存在并是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并是一个文件
-r file 检查file是否存在并可读
-s file 检查file是否存在并非空
-w file 检查file是否存在并可写
-x file 检查file是否存在并可执行
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

2.3 复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:

[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]

2.4 if-then高级特性
  • 用于数学表达式的双括号
  • 用于高级字符串处理功能的双方括号
2.4.1 双括号
(( expression ))

双括号命令允许你在比较过程中使用高级数学表达式。test命令只能在比较中使用简单的 算术操作。双括号命令提供了更多的数学符号:

符号 描述
val++ 后增
val– 后减
++val 先增
–val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
  • 双括号中表达式里的大于号转义不需要转义
2.4.2 双方括号
[[ expression ]]

双方括号命令提供了针对字符串比较的高级特性,expression使用了test命令中采用的标准字符串比较。但它提供了test命 令未提供的另一个特性——模式匹配(pattern matching)。


2.5 case命令
case variable in 
pattern1 | pattern2) commands1;; 
pattern3) commands2;; 
*) default commands;; 
esac

case命令提供了一个更清晰的方法来为变量每个可能的值指定不同的选项。

打赏
发表评论

电子邮件地址不会被公开。