退出状态
$?记录了上一个命令的退出状态:
0 运行成功
1~125 运行失败
126 找到命令但无法执行
127 未找到要运行的命令
>128 命令被系统强制结束
测试
两种方式:
test expression
[ expression ]
注意[]的两边必须要空格
比较条件为真返回0,假返回非0(C语言为真返回非0正整数,假返回0)
算数比较运算符
n1 -eq n2 等于返回0,不等于返回1
n1 -gt n2
n1 -ge n2
n1 -le n2
n1 -lt n2
n1 -ne n2 不等于返回0,等于返回1
例:
[root@localhost tmp]# n1=15
[root@localhost tmp]# [ "$n1" -eq 15 ]
[root@localhost tmp]# echo $?
0
[root@localhost tmp]# test "$n1" -eq 15
[root@localhost tmp]# echo $?
0
[root@localhost tmp]# [ $n1 -ne 15 ]
[root@localhost tmp]# echo $?
1
[root@localhost tmp]# test $n1 -ne 15
[root@localhost tmp]# echo $?
1
注意:只能比较整数,不能比较浮点数
字符串运算符
方式1:(只能用test运算符)
-n string 测试字符串string是否不为空(不为空是真,值为0,为空值为1),-n为默认,可省略
-z string 测试字符串string是否为空(为空是真,值为0,不为空值为1)
方式2:
string1=string2 测试string1是否与string2相同
string1!=string2 测试string1是否与string2不同
例:
[root@localhost tmp]# str1="hello"
[root@localhost tmp]# test -n "$str1"
[root@localhost tmp]# echo $?
0
[root@localhost tmp]# test -z "$str1"
[root@localhost tmp]# echo $?
1
[root@localhost tmp]# [ "$str1"!=" " ]
[root@localhost tmp]# echo $?
0
[root@localhost tmp]# [ "$str1" -n " " ] #方式1不能用于[]
bash: [: -n: binary operator expected
[root@localhost tmp]# test "$str1"!=" " #方式2通用
[root@localhost tmp]# echo $?
0
文件操作符
test file_operator File
[ file_operator file ]
file_operator:
-d 是否为目录
-f 是否为普通文件
-e 是否存在
-r 是否可读
-w 是否可写
-x 是否可执行
-s 长度是否不为0
-L 是否符号化链接
如:
[ -d clc.txt ]
test -d clc.txt
echo $?
逻辑运算符
! 非
-a 与
-o 或
[ ! -e clc.txt ] #clc.txt不存在为真(值为0)
[ -e clc.sh -a -x clc.sh ] #clc.sh存在并且可执行则结果为真
判断
1.
if expression
then
...
fi
2.
if expression; then
...
fi
3.
if expression1
then
...
else
...
fi
4.
if expression1
then
...
elif expression2
then
...
else
...
fi
expression为表达式,如[ -e clc.sh -a -x clc.sh ]
case结构
case variable in
value1)
...;;
value2)
...;;
*)
...;;
esac
算术运算符
+;-;*;/;%;**(幂运算)
例:
let "z=8/5*5"
echo $z #结果为5,因为8/5取整结果为5
位运算符
<< 左移
>> 右移
| 按位与
~ 按位非
^ 按位异或
例:
[root@localhost tmp]# let "value=~8"
[root@localhost tmp]# echo $value
-9
[root@localhost tmp]# let "value=12|8"
[root@localhost tmp]# echo $value
12
[root@localhost tmp]# value=8
[root@localhost tmp]# let "value<<=2"
[root@localhost tmp]# echo $value
32
注:正数的补码=原码,负数的补码=反码+1。因为8为0000 1000,~8的原码为1111 0111,反码为1000 1000,补码为1000 1001,所以~a=-(a+1)
自增自减运算
[root@localhost tmp]# num=5
[root@localhost tmp]# let "a=5+(++num)"
[root@localhost tmp]# echo $a
11
[root@localhost tmp]# num1=5
[root@localhost tmp]# let "a=5+(num1++)"
[root@localhost tmp]# echo $a
10
[root@localhost tmp]# num2=5
[root@localhost tmp]# let "a=(num2++)+(++num2)" #6+6
[root@localhost tmp]# echo $a
12
[root@localhost tmp]# echo $num2
7
[root@localhost tmp]# num3=5
[root@localhost tmp]# let "a=(num3++)+(++num3)+(++num3)" #6+7+7
[root@localhost tmp]# echo $a
20
[root@localhost tmp]# num3=5
[root@localhost tmp]# let "a=(num3++)+(++num3)+(++num3)+(++num3)" #6+7+8+8
[root@localhost tmp]# echo $a
29
[root@localhost tmp]# num3=5
[root@localhost tmp]# let "a=(num3++)+(++num3)+(++num3)+(++num3)+(++num3)" #6+7+8+9+9
[root@localhost tmp]# echo $a
39
[root@localhost tmp]# num3=5
[root@localhost tmp]# let "a=(num3++)+(++num3)+(++num3)+(++num3)+(++num3)+(num3++)" #6+7+8+9+9+10
[root@localhost tmp]# echo $a
49
[root@localhost tmp]# num3=5
[root@localhost tmp]# let "a=(num3++)+(++num3)+(++num3)+(++num3)+(++num3)+(num3++)+(num3++)"
[root@localhost tmp]# echo $a
60
注:前置++为先自加后运算
数字常量
二进制:2#num
八进制:0num或8#num
十六进制:0xnum或16#num
例:
[root@localhost tmp]# let "num=2#1000"
[root@localhost tmp]# echo $num
8
[root@localhost tmp]# let "num=8#10"
[root@localhost tmp]# echo $num
8
[root@localhost tmp]# let "num=010"
[root@localhost tmp]# echo $num
8