shell的条件测试

  • 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。
  • 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。
  • 条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以了解和掌握这些条件测试是非常重要的。

一、条件测试的基本语法

  •         在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。
  •         当指定的条件为真时,整个条件测试的返回值为0
  •         反之,如果指定的条件为假,则条件测试语句的返回值为非0值。


二、文件测试表达式

测试文件的读、写、执行等属性,不光是根据文件属性 rwx 的标识来判断,还要看当前执行测试的用户 是否真的可以按照对应的权限操作文件。

经典案例

[root@server ~] # [ -d /root ] && echo y || echo n
y
[root@server ~] # [ -d /aa ] && echo y || echo n
n
[root@server ~] # [ -b /dev/nvme0n1 ] && echo y || echo n
y
[root@server ~] # [ -L /dev/cdrom ] && echo y || echo n
y
[root@server ~] # ll /dev/cdrom
lrwxrwxrwx 1 root root 3 3 22 11 :31 /dev/cdrom - > sr0
[root@server ~] # [ -e /file1 ] && echo y || echo n
n
[root@server ~] # touch /file1
[root@server ~] # [ -e /file1 ] && echo y || echo n
y

nvme0是你的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 0
1
[root@server ~] # (( 9 > 5 )) && echo 1 || echo 0
1
[root@server ~] # ((9>5)) && echo 1 || echo 0
1
[root@server ~] # ((9>13)) && echo 1 || echo 0
0
[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 "

七、 特殊条件测试表达式案例:

[ 条件 1 ] &&
命令 1
命令 2
命令 3
[[ 条件 1 ]] &&
命令 1
命令 2
命令 3
test 条件 1 &&
命令 1
命令 2
命令 3
if [ 条件 1 ]
then
命令 1
命令 2
命令 3
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值