12 使用结构化命令

12.1 if, then, else, elif及其嵌套

bash会运行if后面的command。如果该命令的状态码是0(即成功执行),则进入then,否则进入else。

12.2 test命令

如果我们要在if后面跟其他内容,可以容test命令。

test condition

test命令后面的条件如果成立,则其返回0,if进入then。否则进入else。除了test命令外,还有一种更简单的写法

if [ condition ]; then
commands
fi

注意第一个方括号之后和第二个方括号之前有一个空格,不然会报错。

test命令支持三类判断:

  • 数值比较

  • 字符串比较

  • 文件比较

数值比较

比较

描述

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

bash shell只能处理整数,在test比较中用哪个浮点数会报错。

字符串比较

比较

描述

str1 = str1

str1和str2相同

str1 != str2

str1和str2不相同

str1 < str2

str1比str2小

str1 > str2

str1比str2大

-n str1

str1的长度是否非0

-z str1

str1的长度是否为0

注意大于号和小于号必须转义,不然会被当成重定向符号。

文件比较

比较

描述

-e file

file是否存在

-d file

file是否存在且是目录

-f file

file是否存在且是文件

-r file

file是否存在且可读

-w file

file是否存在且可写

-s file

file是否存在且非空

-x file

file是否存在且可执行

-O file

file是否存在且属于当前用户

-G file

file是否存在且属于当前用户组

file1 -nt file2

file1是否比file2新

file1 -ot file2

file1是否比file2旧

12.6 双括号和双方括号

双括号

双括号中可以使用高级的数学表达式(支持自增自减,左右位移,逻辑运算和布尔逻辑运算,求幂**),且大于小于符号不用转义。

双方括号

双方括号支持模式匹配

#!/bin/bash
# using patter matching
#
if [[ $USER == l* ]]; then
echo "Hello $USER"
else
echo "Sorry, I do not know you"
fi

运行

leo@ubuntu:~/sh_test$ ./test.sh
Hello leo