【第四章】Shell 条件测试表达式

shell中条件测试的三种格式:

格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: [[ 条件表达式 ]]

使用test:
[[email protected]-131 ~]# test -f file && echo true || echo false
false
[[email protected]-131 ~]# touch file
[[email protected]-131 ~]# test -f file && echo true || echo false
true

[[email protected]-131 ~]# man test #可以查看帮助
 -z 测试如果字符串长度是否为零:
[[email protected]-131 ~]# test -z "yanglt" && echo 1 || echo 0
0
[[email protected]-131 ~]# char="yanglt"
[[email protected]-131 ~]# test -z "$char" && echo 1 || echo 0
0
[[email protected]-131 ~]# char=""
[[email protected]-131 ~]# test -z "$char" && echo 1 || echo 0
1

使用[]:
[[email protected]-131 tmp]# touch yanglt.txt
[[email protected]-131 tmp]# [ -f /tmp/yanglt.txt ] && echo 1 || echo 0
1

判断逻辑表达式写法:
[[email protected]-131 tmp]# [ -f /tmp/yanglt.txt ] && echo 1    #成功输出1
1
[[email protected]-131 tmp]# [ -f /tmp/yanglt.txt ] || echo 0    #不成功输出0
[[email protected]-131 tmp]# [ -f /tmp/yanglt123.txt ] || echo 0
0

[]命令和test命令的选项时通用的,所以[] 也可以用 man test 命令获取帮助

使用[[]]:
[[email protected]-131 tmp]# [[ -f /tmp/yanglt.txt ]] && echo 1 || echo 0
1

:[[]] 表达式和 []和test 测试表达式区别:
[[]]:可以使用通配符进行模式匹配,可以使用&& 、 || 、> 、< 等操作符
但不能用于[]中,[]中一般使用-a 、-o 、-gt(用于整数) 、-lt(用于整数)

查看帮助:

test、[]、[[]]这些操作符的用法,通过help test 或 man test查询得到帮助,完整的[]、[[]] 用法可以通过man bash来获得帮助。

一、文件测试表达

常用的文件测试操作符:

(1) 普通文件(测试文件类型)

[[email protected]-131 ~]# touch yanglt
[[email protected]-131 ~]# ls -l |grep "yanglt$"
-rw-r--r--  1 root root      2592 6月  20 21:00 yanglt
[[email protected]-131 ~]# [ -f yanglt ] && echo 1 || echo 0
1
(2)目录文件 (测试目录类型)

[[email protected]-131 ~]# mkdir yanglt01

[[email protected]-131 ~]# [ -f yanglt01 ] && echo 1|| echo 0   #测试是否为普通文件 是为1,不是为0
0
[[email protected]-131 ~]# [ -e yanglt01 ] && echo 1|| echo 0   #测试yanglt001是否存在
1
[[email protected]-131 ~]# [ -d yanglt01 ] && echo 1|| echo 0   #测试是否为目录
1
[[email protected]-131 ~]# [ -d yanglt ] && echo 1|| echo 0
0
[[email protected]-131 ~]# 

(2)测试文件属性
[[email protected]-131 ~]# ls -l yanglt
-rw-r--r-- 1 root root 2592 6月  20 21:00 yanglt
[[email protected]-131 ~]# ls -l yanglt01
总用量 0
[[email protected]-131 ~]# [ -r yanglt ] && echo 1||echo 0
1
[[email protected]-131 ~]# [ -w yanglt ] && echo 1 || echo 0
1
[[email protected]-131 ~]# [ -x yanglt ] && echo 1 || echo 0
0

[[email protected]-131 ~]# chmod 001 yanglt
[[email protected]-131 ~]# ls -l yanglt
---------x 1 root root 2592 6月  20 21:00 yanglt

#我们发现用户权限没有读写,但是下边依然可以返回1,这就是root用户比较特殊的地方
[[email protected]-131 ~]# echo ‘text‘ > yanglt
[[email protected]-131 ~]# cat yanglt
text
[[email protected]-131 ~]# [ -w yanglt ] && echo 1 || echo 0
1
[[email protected]-131 ~]# [ -x yanglt ] && echo 1 || echo 0
1
[[email protected]-131 ~]# [ -r yanglt ] && echo 1||echo 0
1

当我们切换用户后按照以上方法再次操作:
[[email protected]-131 ~]# su - yanglt1
[[email protected]-131 ~]$ touch yanglt001
[[email protected]-131 ~]$ ls -l yanglt001
-rw-rw-r-- 1 yanglt1 yanglt1 0 6月  20 21:14 yanglt001
[[email protected]-131 ~]$ [ -x yanglt001 ] && echo 1 || echo 0
0
[[email protected]-131 ~]$ [ -w yanglt001 ] && echo 1 || echo 0
1
[[email protected]-131 ~]$ [ -r yanglt001 ] && echo 1 || echo 0
1
[[email protected]-131 ~]$ chmod 001 yanglt001
[[email protected]-131 ~]$ [ -x yanglt001 ] && echo 1 || echo 0
0
[[email protected]-131 ~]$ ls -l
总用量 0
---------x 1 yanglt1 yanglt1 0 6月  20 21:14 yanglt001    #我们可以看到没有该用户读写执行权限,下边的测试结果可见
[[email protected]-131 ~]$ [ -x yanglt001 ] && echo 1 || echo 0
0 #因为文件所属主没有执行权限
[[email protected]-131 ~]$ [ -w yanglt001 ] && echo 1 || echo 0
0
[[email protected]-131 ~]$ [ -r 4yanglt001 ] && echo 1 || echo 0
0
[[email protected]-131 ~]$ 

测试文件的读写执行属性,不仅要看rwx,还要看当前用户是否有操作该文件的对应权限

二、字符串测试表达式

对于字符串的测试,一定要将字符串加双引号之后在进行比较

比较符号“!=”和“=”两端要有空格,比较两个字符串是否相同

[[email protected]131 ~]# [ -n "abc" ]&& echo 1 || echo 0    #字符串长度不为零
1
[[email protected]-131 ~]# test -n "abc" && echo 1 || echo 0
1
[[email protected]-131 ~]# var="yanglt"
[[email protected]-131 ~]# test -z "$var" && echo 1 || echo 0 #字符串长度为零的时候为真,现在不为真返回0
0
[[email protected]-131 ~]# [ "abc" = "abc"]    #括号两边需要加空格
-bash: [: 缺少 `]‘
[[email protected]131 ~]# [ "abc" = "abc" ]
[[email protected]-131 ~]# [ "abc" = "abc" ] && echo 1
1
[[email protected]-131 ~]# [ "abc" != "abc" ] && echo 1     #成立返回1,不成立返回0
[[email protected]-131 ~]# [ "$var" != "abc" ] && echo 1
1
[[email protected]-131 ~]# [ "$var" = "abc" ] && echo 1

等号两边没有空格会出现以下判断错误:
[[email protected]-131 ~]# [ "abc" = "1" ] && echo 1 || echo 0
0
[[email protected]-131 ~]# [ "abc"="1" ] && echo 1 || echo 0
1
[[email protected]-131 ~]#

字符串不加双引号出现逻辑的错误:
[[email protected] ~]# var=""
[[email protected] ~]# [ -n "$var" ] && echo 1 || echo 0
0
[[email protected] ~]# [ -n $var ] && echo 1 || echo 0
1
[[email protected] ~]# [ -z $var ] && echo 1 || echo 0
1
[[email protected] ~]# [ -z "$var" ] && echo 1 || echo 0
1
[[email protected] ~]#

三、数值测试表达式

有关[]、[[]]、(())用法的小结:

  • 整数加双引号的比较是对的。
  • [[]]中用类似-eq等的写法是对的,[[]]中用类似>、<的写法也可能不对,有可能会只比较第一位,逻辑结果不对。
  • []中用类似>、<的写法在语法上虽然可能没错,但逻辑结果不对,可以使用=、!=正确比较。
  • (())中不能使用类似-eq等的写法,可以使用类似>、<的写法。

参考文件:跟老男孩学shell

原文地址:https://www.cnblogs.com/yangleitao/p/9201626.html

时间: 2024-10-06 04:22:22

【第四章】Shell 条件测试表达式的相关文章

第四章 shell学习之sed命令和awk编程

sed命令 sed只是对缓冲区中原始文件的副本进行编辑,不改变源文件,所以要保存则要重定向到另一个文件 sed三种方式: 1.sed [选项] 'sed命令' 输入文件 2.sed [选项] -f sed脚本文件 输入文件 3../sed脚本文件 输入文件 其中3的sed脚本文件要以#! bin/sed -f等开头 选项: -n 不打印所有行到标准输出,默认先打印匹配的再打印所有 -e 关联多个sed命令 -f 调用sed脚本文件 定位文本: x x为指定行号 x,y 从x到y行 /patter

shell条件测试test

shell条件测试可以通过以下两种方式: test   参数    测试内容 [ 参数  测试内容 ] 一.测试文件类型: test  -e   文件名          (测试文件是否存在) [ -e  文件名 ]                测试文件是否存在,注意中括号两边的空格 test -f   文件名             判断是否为普通文件 test -d   文件名            判断是否为目录 test -b   文件名            判断是否为块设备文件 t

shell条件测试,运算符,选择结构,for循环结构

一.shell条件测试      man bash  //查看帮助 条件测试的命令 test 选项 文件名或目录名 或 [ 选项 文件名或目录名 ] 例: [ -e /etc/passd ] 文件状态 -f              //判断是不是文件,是文件为真 -d //判断是不是目录,是目录为真 -e //判断是不是存在,存在为真 -r //判断是否可以阅读,可以阅读为真 -w //判断是否可写,可写为真 -x //判断是否可执行,可执行为真 -l //判断是否为链接,是链接为真 数值比较

shell条件测试语句实例-测试apache是否开启

终于理解了shell条件测试语句”!=“和"-n"的用法区别,于是有了如下的shell脚本,做为练习. 第一种方法:测试apache是否开启?字符串测试 #!/bin/bash # www.jquerycn.cn web=`/usr/bin/pgrep httpd` if [ -n "$web" ]; //$web返回值是否为空 then echo "httpd is running" else /etc/init.d/httpd start f

Shell条件测试语句及三种if语句

7 - Shell_条件操作测试及if语句 要使Shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作.例如,当磁盘使用率超过95%发送警告:当备份目录不存在时能够自动创建:当源码编译程序的配置失败则不再继续安装等. Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败. 使用专门的测试工具-test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立) 使用te

Linux Shell 条件测试

条件测试方式一 test命令: if test $n1 -eq $n2 then echo "The two number are equal" fi []命令 if [ $n1 -eq $n2 ] then echo "The two number are equal" fi 在Bash中 test命令和[]是等价的. 条件测试方式二 (( expression )) 测试数学表达式结果 if ((n1 == n2)) then echo "The tw

bash Shell条件测试

3种测试命令: test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]  注意:EXPRESSION前后必须有空白字符 bash的测试类型 数值测试: -eq:是否相等 -ne:是否不等 -ge:是否大于等于 -le:是否小于等于 -gt:是否大于 -lt:是否小于 字符串测试: =或==:是否等于 >:是否大于 <:是否小于 !=:是否不等于 =~:左侧字符串是否能够被右侧PATTERN所匹配 [[  ]]中使用 -z "STRING&quo

第四章 Shell流程控制

流程控制是改变程序运行顺序的指令. 4.1 if语句 4.1.1 单分支 if 条件表达式; then     命令 fi 示例: #!/bin/bash N=10 if [ $N -gt 5 ]; then     echo yes fi # bash test.sh yes 4.1.2 双分支 if 条件表达式; then     命令 else     命令 fi 示例: #!/bin/bash N=10 if [ $N -lt 5 ]; then     echo yes else   

Shell 条件测试

文件状态测试 -b filename 当filename 存在并且是块文件时返回真(返回0) -c filename 当filename 存在并且是字符文件时返回真 -d pathname 当pathname 存在并且是一个目录时返回真 -e pathname 当由pathname 指定的文件或目录存在时返回真 -f filename 当filename 存在并且是正规文件时返回真 -g pathname 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真 -h filen