退出状态

$?记录了上一个命令的退出状态:

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