- 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。
- 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。
- 条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以了解和掌握这些条件测试是非常重要的。
一、条件测试的基本语法
- 在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。
- 当指定的条件为真时,整个条件测试的返回值为0
- 反之,如果指定的条件为假,则条件测试语句的返回值为非0值。
二、文件测试表达式
测试文件的读、写、执行等属性,不光是根据文件属性 rwx 的标识来判断,还要看当前执行测试的用户 是否真的可以按照对应的权限操作文件。
经典案例
[root@server ~] # [ -d /root ] && echo y || echo ny[root@server ~] # [ -d /aa ] && echo y || echo nn[root@server ~] # [ -b /dev/nvme0n1 ] && echo y || echo ny[root@server ~] # [ -L /dev/cdrom ] && echo y || echo ny[root@server ~] # ll /dev/cdromlrwxrwxrwx 1 root root 3 3 月 22 11 :31 /dev/cdrom - > sr0[root@server ~] # [ -e /file1 ] && echo y || echo nn[root@server ~] # touch /file1[root@server ~] # [ -e /file1 ] && echo y || echo nynvme0是你的ssd硬盘的主控芯片,
nvme0n1是你的ssd硬盘的主存储器。
Linux中的
/dev/cdrom
代表光驱。在Linux系统中,
/dev
目录用于储存硬件设备信息,通过其下的目录可以直接访问硬件。/dev/cdrom
是光驱的设备名,而/dev/sr0
也是光驱的设备名;
/dev/cdrom
是/dev/sr0
的软链接。这意味着,当你访问/dev/cdrom
时,你实际上是在访问/dev/sr0
常用参数
①test示例:
②、[ ]示例(注意测试表达式和方括号两边需要有空格)
③、[[ ]]示例(注意测试表达式和[[]]两边需要有空格)
④、注意:如果测试的文件路径是用变量来代替,变量一定要加引号
设置一个空的变量:file
⑤、(()) 语法
[root@server ~] # ((9>5)) && echo 1 || echo 01[root@server ~] # (( 9 > 5 )) && echo 1 || echo 01[root@server ~] # ((9>5)) && echo 1 || echo 01[root@server ~] # ((9>13)) && echo 1 || echo 00[root@server ~] # ((9>13.5)) && echo 1 || echo 0 # 注意:不支持小数运算-bash : ((: 9 >13.5 :语法错误 : 无效的算术运算符 ( 错误符号是 ".5" )0
三、字符串测试表达式
①、test案例
[root@localhost s] # test -n abc;echo $?0[root@localhost s] # test -n "";echo $?1[root@localhost s] # test -n " ";echo $?0[root@localhost s] # test -z '';echo $?0[root@localhost s] # test -z abc;echo $?1[root@localhost s] # test -z ' ';echo $?1[root@localhost s] # test abc = abcd ;echo $? # 注意等号两边需要有空格1[root@localhost s] # test abc=abcd ;echo $?0
②、[ ]案例
[root@localhost s] # [ -n '' ];echo $?1[root@localhost s] # [ -n ' ' ];echo $?0[root@localhost s] # [ -z '' ];echo $?0[root@localhost s] # [ abc=abcd ];echo $?0[root@localhost s] # [ abc = abcd ];echo $? # 注意等号两边需要有空格1
③、[[ ]]案例
[root@localhost s] # [[ -n abc ]];echo $?0[root@localhost s] # [[ -n ' ' ]];echo $?0[root@localhost s] # [[ -n '' ]];echo $?1[root@localhost s] # [[ abc=acd ]] ;echo $?0[root@localhost s] # [[ abc = acd ]] ;echo $? # 注意等号两边需要有空格1
④、注意:测试对象是变量时,变量需要加引号
[root@localhost s] # test -n $name;echo $?0[root@localhost s] # test -n "$name";echo $?1[root@localhost s] # [ -n $name ];echo $?0[root@localhost s] # [ -n "$name" ];echo $?1
四、 整数测试表达式
- =和!=也可在[]中作比较时使用,在[]中也可使用>和<符号,但需要使用反斜线转义,有时不转译虽然语 法不会报错,但是结果可能会不对;
- 在[[]]中也可使用包含-gt和-lt的符号,不建议使用;
- 比较符号两端也要有空格。
①、test案例
[root@localhost test3] # test 2 -eq 3;echo $?1[root@localhost test3] # test 2 -eq 2;echo $?0
②、[ ]案例
[root@localhost test3] # [ 2 -ne 3 ];echo $?0[root@localhost test3] # [ 2 -ne 2 ];echo $?1
③、[[ ]]案例
[root@localhost test3] # [[ 2 != 3 ]];echo $?0[root@localhost test3] # [[ 2 != 2 ]];echo $?1[root@localhost test3] # [[ 2!=2 ]];echo $? 未写空格,导致出错0
④、(())案例
[root@localhost test3] # (( 2!=3 ));echo $?0[root@localhost test3] # ((2!=3));echo $?0[root@localhost test3] # ((2=3));echo $?-bash : ((: 2 = 3 : attempted assignment to non-variable (error token is "=3" )1[root@localhost test3] # ((2==3));echo $?1[root@localhost test3] # ((2>3));echo $?1[root@localhost test3] # ((2<3));echo $?0
五、 逻辑操作符
[root@server s]# ll
总用量 24
-rw-r--r--. 1 root root 1 8月 9 17:15 1
-rw-r--r--. 1 root root 13 8月 9 11:45 test
-rwxr-xr-x. 1 root root 104 8月 9 11:59 test1.sh
-rw-r--r--. 1 root root 0 8月 9 12:06 test2.s
-rwxr-xr-x. 1 root root 146 8月 9 12:08 test2.sh
-rwxr-xr-x. 1 root root 66 8月 9 12:33 test3.sh
-rwxr-xr-x. 1 root root 92 8月 9 11:56 test4.sh
[root@server s]# [ -d test -a -f test ];echo $?
1
[root@server s]# [ -d test -o -f test ];echo $?
0
[root@server s]# test -f 1 && echo 1 || echo 0
1
[root@server s]# ! test -f test;echo $?
1注:命令1 && 命令2,如果命令1执行不成功,则命令2不执行。命令3 || 命令4,如果命令3成功,不执行命令4;如果命令3不成功,则执行命令4
六、练习
1:
通过 read 传入一个数字,如果传入的数字等于 1 ,就打印 1 ;如果等于 2 ,就打印 2 ,如果不等于 1 也不等于2 ,就提示输入不对,然后退出程序。
2:
通过 read 读入两个整数,并比较他们的大小
3:
假设执行一个可以携带参数的 script ,执行该脚本后屏幕会显示如下的数据:程序的文件名;共有几个参数;若参数的个数小于 2 个则告知用户参数数量太少;全部的参数内容;第一 个参数;第二个参数。echo "the script name is $0 "echo "the parameter number is $# "[ " $# " -lt 2 ] && echo "the number of parameter is less than 2." && exit 0
在方括号内的每个组件都需要由空格键来分隔(特别注意中括号的两端需要有空格符来分隔);在方括 号内的变量,最好都要以双引号括起;在方括号内的常量最好都以单或双引号括起来。(中括号的使用方法与test 几乎一模一样)
echo "your whole parameter is ' $@ '"echo "the 1st parameter is $1 "echo "the 2nd parameter is $2 "