一、退出状态
系统每执行一个命令,都会返回一个退出状态,若返回退出状态为0,表示命令执行成功,
若返回退出状态不为0,表示命令执行有错误。
echo $? 可以打印出退出状态。
例如:ls
echo $?
状态值 | 含义 |
0 | 命令执行成功,没有错误 |
1-125 | 运行失败,脚本命令、系统命令错误或参数传递错误 |
126 | 有该命令,但无法执行 |
127 | 没有该命令 |
>128 | 命令被系统强制结束 |
二、测试test或[]
测试命令用于判断表达式的真假。测试条件为真,返回值0;测试条件为假,返回值不为0。
这与C语言0为假有区别。
格式 test expression 或
[ expression ]
备注:"[" 后面与 "]" 前面的空格是必须的,否则会报错
三、整数比较运算符
格式: test "num1" numeric_operator "num2" 或
[ "num1" numeric_operator "num2" ]
例如:[ 1 -eq 1] 测试结果为0
整数比较符 | 含义 |
num1 -lt num2 | 判断整数num1是否小于整数num2,如果整数num1小于num2,测试结果为真(0) |
num1 -gt num2 | 判断整数num1是否大于整数num2,如果整数num1大于num2,测试结果为真(0) |
num1 -eq num2 | 判断整数num1是否等于整数num2,如果整数num1等于num2,测试结果为真(0) |
num1 -le num2 | 判断整数num1是否小于等于整数num2,如果整数num1等于num2,测试结果为真(0) |
num1 -ge num2 | 判断整数num1是否大于等于整数num2,如果整数num1等于num2,测试结果为真(0) |
num1 -ne num2 | 判断整数num1是否不等于整数num2,如果整数num1不等于num2,测试结果为真(0) |
四、字符串运算符
格式 :test "string1" operator "sting2" 或
[ "string1" operator "sring2" ]
test operator "string1" 或
[ operator "string1" ]
例如:[ "ab" == "ab" ] 测试结果为0
a="dfds"
[ -z "$a"] 测试结果不为0
字符串运算符 | 含义 |
string1 == string2 (==两边空格不要省略) | 判断字符串string1是否等于字符串string2,如果整数string1等于string2,测试结果为真(0) |
string1 != string2 (!=两边空格不要省略) | 判断字符串string1是否不等于字符串string2,如果整数string1等于string2,测试结果为真(0) |
string1 | 判断字符串string1是否不为空,如果整数string1不为空,测试结果为真(0) |
-n string1 | 判断字符串string1是否不为空,如果整数string1不为空,测试结果为真(0) |
-z string1 | 判断字符串string1是否为空,如果整数string1为空,测试结果为真(0) |
五、文件运算符
格式 :test operator file 或
[ operator file ]
例如:ls (如果有普通文件a.csv)
[ -f a.csv] 测试结果为0
文件运算符 | 含义 |
-d file | 判断file是否为目录,如果file是目录,测试结果为真(0) |
-f file | 判断file是否为普通文件,如果file是普通文件,测试结果为真(0) |
-e file | 判断file是否为存在,如果file是存在,测试结果为真(0) |
-r file | 判断file是否可读,如果file可读,测试结果为真(0) |
-w file | 判断file是否可写,如果file可写,测试结果为真(0) |
-x file | 判断file是否可执行,如果file可执行,测试结果为真(0) |
-s file | 判断file长度是否不为0,如果file长度是否不为0,测试结果为真(0) |
-L file | 判断file是否符号化链接,如果file是符号化链接,测试结果为真(0) |
六、逻辑运算符
例如:[ 1 -eq 1 -a 2 -eq 2],测试结果为0(真)
[ ! 1 -eq 1 ],测试结果不为0(假)
逻辑运算符 | 含义 |
! expression | 如果expression为假,测试结果为真(0) |
expression1 -a expression2 | 如果expression1和expression2同时为真,测试结果为真(0) |
expression1 -o expression2 | 如果expression1或expression2其中一个为真,测试结果为真(0) |
七、[[]]与[]区别
这是内置在shell中的一个命令,它就比刚才说的[]强大的多了。支持字符串的模式匹配(使用=~操作符时甚至支持shell的基本和扩展正则表达式)。逻辑组合可以不使用[]的-a,-o而使用&& ||。
支持通配符,比如[[ hello == hell? ]],结果为真。
注意:使用[]和[[]]的时候不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]的结果为“假”,但[[ 1==2 ]]的结果为“真”!
例如:
[[ hello =~ he*llo]] ,测试结果为0(正则表达式)
[[hello == hell?]] ,测试结果为0(通配符)