0%

使用结构化命令

使用结构化命令

原因:许多程序在脚本命令之间需要某种逻辑流控制。

使用if-then语句

最基本的结构化命令类型为if-then语句,格式为:

1
2
3
4
5
6
7
if command

then

command

fi

这里有一些困惑,如果if后面的命令运行成功(即返回的是0值),就会执行then后面的command的,相反,就会跳过。

比如,你可以搜索你的名字是否在passwd中

1
2
3
4
5
6
7
if grep leo /etc/passwd

then

echo “yeah , you are in the /etc/passwd file”

fi

if-then-else语句

上面的if-then只有一个选择,而这个可以有多个选择。

格式为:

1
2
3
4
5
6
7
8
9
10
11
if command

then

command

else

command

fi

嵌套if语句

使用else部分的另一种版本,成为elif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if command

then

command

elif command

then

command

elif command

then

command

……

fi

test命令

test命令提供了一种检测if-then语句中不同条件的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if test condition

then

commands

fi

或者

if [condition]

then

commands

fi

test命令能够评估以下3类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

数值比较

test命令最常用于比较两个数值。

  • test int1 -eq int2 判断是否相等
  • test int1 -ne int2 判断是否不等
  • test int1 -lt int2 判断是否小于
  • test int1 -le int2 判断是否不小于
  • test int1 -gt int2 判断是否大于
  • test int1 -ge int2 判断是否不大于

字符串比较

test也允许对字符串进行比较,执行字符串比较可能有点复杂。

  • test –n 字符串 字符串的长度非零
  • test –z 字符串 字符串的长度为零
  • test 字符串1=字符串2 字符串相等
  • test 字符串1!=字符串2 字符串不等
  • test 字符串1>字符串2 字符串1大于字符串2
  • test 字符串1<字符串2字符串1小于字符串2

字符串比较:

  • 大于和小于符号一定要转义,否则shell会将他们当做重定向符号,将字符串值看做文件名;
  • 大于和小于顺序与在sort命令中的顺序不同

文件比较

Shell脚本中最强大和最常用的一类比较。test命令能够测试linux文件系统上的文件状态和路径。

文件比较:-

  • -d file 检查file是否存在并且是一个目录
  • -e file 检查file是否存在
  • -f file 检查file是否存在并且是一个文件
  • -r file 检查file是否存在并且可读
  • -s file 检查file是否存在并且不为空
  • -w file 检查file是否存在并且可写
  • -x file 检查file是否存在并且可执行
  • -0 file 检查file是否存在并且被当前用户拥有
  • -G file 检查file是否存在并且默认组是否为当前用户组
  • file1 -nt file2 检查file1是否比file2新
  • file1 -ot file2 检查file1是否比file2旧

复合条件检查

if-then语句可以使用布尔逻辑来合并检查条件,可以使用两个布尔操作符:

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

if-then的高级特征

Bash shell中最近增加了两个比较新的功能,它们提供了可以在if-then语句中使用的高级功能:

  • 双圆括号表示数学表达式
  • 双方括号表示高级字符串处理函数

使用双圆括号

双圆括号命令允许在比较中包含高级数学公式。双圆括号命令提供更多的数学符号,这些符号是其他语言程序员习惯使用的符号。格式为:

((expression))

双圆括号命令符号

  • val++ 后增量
  • val– 前减量
  • ++val 前增量
  • –val 后减量
  • ! 逻辑否定
  • ~ 逐位取反
  • ** 取幂
  • << 逐位左移
  • 逐位右移

  • & 逐位布尔逻辑与
  • | 逐位布尔逻辑或
  • && 逻辑与
  • || 逻辑或

使用双方括号

双方括号命令为字符串比较提供了高级功能,它提供了test命令没有的另一个功能,即模式匹配。例如

1
2
3
4
5
6
7
8
9
10
11
if [[ $USER == r*]]

then

echo “hello $USER

else

echo “Sorry, I do not know you”

fi

case命令

替代if-then-elif,提供了一种为每个可能的变量值指定不同选项的更清楚的方法。

格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
case variable in

pattern1 | pattern2) command1;

pattern3) command2;

……

patternN) commandN;

*) default commands;

esac
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道