一、条件测试
1.条件测试的基本语法
在Shell程序中,用户可以使用测试语句来测试指定的条件表达式的真假。当指定条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非零。
条件测试的语法有两种,分别是test命令和[命令,下面介绍他们的语法:
【1】test命令的语法如下:
test expression
其中,expression表示需要进行测试的条件表达式,可以由字符串、整数、文件名,以及各种运算符组成。
例如,下面的表达式都是有效的条件表达式:
- 1 -eq 2
- ‘string’
- -z ‘string’
- -e file
【2】[命令的语法如下:
[ expression ]
[命令的作用与test相同,为了增加程序的可读性,Shell要求在条件表达式后面追加一个方括号]来与前面的[命令配对。
注意:在Shell中命令与参数之间必须保留一个空格,因此,在上面的语法中,expression与左右两个括号之间也必须保留一个空格。
2.字符串测试
在Shell中用户可以通过5种运算符来对字符串进行操作,如下表:
运算符 | 说明 |
---|---|
string | 判断指定的字符串是否为空 |
string1 = string2 | 判断两个字符串string1和string2是否相等 |
string1 != string2 | 判断两个字符串string1和string2是否不相等 |
-n string | 判断string是否为非空字符串 |
-z string | 判断string是否为空串 |
注意:在给变量赋值的时候等号两边不能有空格,否则Shell会把空格前面的字符串当作Shell命令。
3.整数测试
与字符串测试类似,整数测试也有两种形式的语法
test number1 op number2
或者
[ number1 op number2 ]
下表列出了常见的整数运算符:
运算符 | 说明 |
---|---|
number1 -eq number2 | number1 等于 number2 |
number1 -ne number2 | number1 不等于 number2 |
number1 -gt number2 | number1 大于 number2 |
number1 -lt number2 | number1 小于 number2 |
number1 -ge number2 | number1 大于等于 number2 |
number1 -le number2 | number1 小于等于 number2 |
其实这里的option都是英文字母的缩写,记住英文字母也就记住了这些操作符。
4.文件测试
文件测试的语法如下:
test op file
或者
[ op file ]
常见的文件操作符如下表:
运算符 | 说明 |
---|---|
-a file | 文件是否存在 |
-b file | 文件是否存在,且类型为块文件 |
-c file | 文件是否存在,且类型为字符文件 |
-d file | 文件是否存在,且类型为目录 |
-e file | 同-a操作 |
-s file | 文件长度是否大于0或者文件是否为非空文件 |
-f file | 文件是否存在且为常规文件。 |
-w file | 文件是否存在且可写 |
-L file | 文件是否存在,并且为符号链接。 |
-u file | 文件是否设置suid位 |
-r file | 文件是否存在,并且可读 |
-x file | 文件是否存在,并且可执行 |
5.逻辑操作符
运算符 | 说明 |
---|---|
! expression | 逻辑非 |
expression1 -a expression2 | 逻辑与 |
expression1 -o expression2 | 逻辑或 |
二、条件判断语句
1.if 语句
if语句的语法如下:
if expression
then
statement1
statement2
....
fi
为了使代码更加紧凑,我们可以将if子句和then子句写在一行:
if expression; then
statement1
statement2
....
fi
应用一下if语句:
#!/usr/bin/env bash
# 使用条件测试判断100是否大于20
if [ 100 -gt 20 ]; then
echo "100大于20"
fi
#使用空命令作为条件
if :; then echo "always true"; fi
#使用&&代替if语句
test "$(whoami)" != "root" && ( echo "You are not root")
Output:
$ sh test.sh
100大于20
always true
You are not root
在示例中提到了空命令:,空命令的退出退出状态永远是0,另外例子中出现了勇&&代替if语句的用法,在该语句中,首先是一个test语句,当该语句为真时,则执行&&后面的语句,当该语句为假时则不执行&&后面的语句。
2.if else 语句
if else语句的语法如下:
if expression
then
statement1
statement2
....
else
statement1
statement2
....
fi
这里的使用方法和if类似,就不举例了。
3.if elif 语句
if else语句的语法如下:
if expression
then
statement1
statement2
....
elif expression2
then
statement1
statement2
....
else
statement1
statement2
....
fi
4.使用exit语句退出程序
语法为: exit status
status是退出状态,该参数是一个整数,取值范围为0-255,与其他shell一样,退出状态存储在 ? 中 , 因 此 用 户 可 以 通 过 ?中,因此用户可以通过 ?中,因此用户可以通过?判断程序执行状态。
#!/usr/bin/env bash
echo "hello world"
exit 100
Output:
random@random-wz MINGW64 /d/GOCODE/api-test
$ sh test.sh
hello world
random@random-wz MINGW64 /d/GOCODE/api-test
$ echo $?
100
三、多条件判断语句case
case的语法如下:
case variable in
value1)
statement1
statement2
....;;
value2)
statement1
statement2
....;;
*)
statement1
statement2
......;;
esac
在case语句中有下面三点需要注意:
- 对于变量名variable,可以使用双引号也可以不使用双引号。
- 每个case语句的条件测试部分,都以右括号“)”结束。
- 每个case子句都以一对分号作为结束符。
- case语句结构以esac结尾。
四、运算符
1. 算术运算符
与其他程序设计语言类似,Shell也可以使用算数运算符,如下表:
运算符 | 说明 |
---|---|
+ | 求两个数的和 |
- | 两个数做差 |
* | 两个数相乘 |
/ | 求两个数的商 |
% | 求余 |
** | 幂运算 |
Shell同样也支持复合算数运算符:
运算符 | 说明 |
---|---|
+= | 将左边的数加上右边的数,然后再将和赋值给左边的变量。 |
-= | 将左边的数减去右边的数,然后再将差赋值给左边的变量。 |
*/ | 将左边的数乘以右边的数,然后再将积赋值给左边的变量。 |
/= | 将左边的数除以右边的数,然后再将商赋值给左边的变量。 |
%= | 将左边的数对右边的数求模,然后再赋值给左边的变量。 |
1.1 使用expr外部程序
语法为:expr expression
其中expression为要计算的表达式,需要注意的是运算符两边要有空格,并且需要对*、()进行转义另外,expr不支持幂运算。
#!/usr/bin/env bash
# 计算100-2
result=`expr 100 - 2`
echo ${result}
# 计算 100✖10
result=`expr 100 \* 10`
echo ${result}
# 计算 100/10
result=`expr 100 / 10`
echo ${result}
# 计算(100 + 1)* 10
result=`expr \( 100 + 1 \) \* 10`
echo ${result}
Output:
$ sh test.sh
98
1000
10
1010
1.2 使用$((…))
使用这种形式来进行算数运算写法比较自由,无需对运算符和括号做转义,在运算符两边也可以不加空格,允许采用松散或者紧凑的格式书写表达式。
#!/usr/bin/env bash
# 计算100-2
result=$((100 - 2))
echo ${result}
# 计算 100✖10
result=$(( 100 * 10 ))
echo ${result}
# 计算 100/10
result=$((100 / 10))
echo ${result}
# 计算(100 + 1)* 10
result=$(( ( 100 + 1 ) * 10))
echo ${result}
Output:
$ sh test.sh
98
1000
10
1010
1.3 使用$[…]
使用一个方括号同样可以执行算术运算,这种语法与使用双括号是一样的,可以采用松散或者紧凑的格式书写表达式,也不需要对特殊符号进行转义。
#!/usr/bin/env bash
# 计算100-2
result=$[100 - 2]
echo ${result}
# 计算(100 + 1)* 10
result=$[ ( 100 + 1 ) * 10]
echo ${result}
Output:
$ sh test.sh
98
1010
1.4 使用let命令
使用let命令可以执行一个或者多个计算表达式,其中变量名不需要使用$符号,如果表达式中含有空格或者其他特殊字符,则必须将其引用起来。
#!/usr/bin/env bash
# 定义变量
num=10
# 加法运算
let num=num+1
echo "$num"
# 乘法运算
let num=num*10
echo "$num"
# 幂运算
let num=num**2
echo "$num"
Output:
$ sh test.sh
11
110
12100
2. 位运算符
对于Shell编程位运算符用的比较少,这里只做简单介绍,主要的位运算符如下表:
运算符 | 说明 |
---|---|
<< | 左移 |
>> | 右移 |
& | 按位与 |
~ | 按位非 |
^ | 按位异或 |
同样位运算符也支持复合运算:
运算符 | 说明 |
---|---|
<<= | 变量左移后重新赋值给该变量 |
>>= | 变量右移后重新赋值给该变量 |
&= | 变量按位与后重新赋值给该变量 |
~= | 变量按位非后重新赋值给该变量 |
^= | 变量按位异或后重新赋值给该变量 |
3. 自增、自减运算符
运算符 | 说明 |
---|---|
++variable | 先对变量值加一,然后赋值给variable |
–variable | 先对变量值减一,然后赋值给variable |
variable++ | 先使用variable的值,然后再将该变量的值加一 |
variable– | 先使用variable的值,然后再将该变量的值减一 |
4.数字常量的进制
Shell总是以十进制来表示数字,但是用户也可以使用其他进制的数字,如以0开头表示八进制,以0x开头表示十六进制。当然也可以通过#注明进制,如2#1000表示二进制,8#100表示八进制。