Shell ❀ 条件测试语句

Posted 无糖可乐没有灵魂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell ❀ 条件测试语句相关的知识,希望对你有一定的参考价值。

文章目录

三、条件测试

1、基本语法

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

命令格式1:test 条件表达式
命令格式2:[ 条件表达式 ]
命令格式3:[[ 条件表达式 ]]
# [  ]的两边需要存在空格

2、表达式

命令格式:

[ 操作符 文件或目录 ]

2.1 条件判断表达式

  • [ -a file ]:如果file文件存在则为真;
  • [ -b file ]:如果file文件存在且是一个特殊文件则为真(文件类型分为七种,分别是:-bcdlps- 为普通文件类型,l 为链接文件,需要注意其链接目标文件类型是否为普通文件类型,其他类型均属于特殊类型);
  • [ -c file ]:如果file文件存在且是一个特殊文件则为真;
  • [ -d file ]:如果file文件为目录则为真;
  • [ -e file ]:如果file文件存在则为真;
  • [ -f file ]:如果file文件存在且是一个普通文件则为真;
  • [ -g file ]:如果file文件存在且已经设置了SGID则为真;
  • [ -h file ]:如果file文件存在且是一个符号连接则为真;
  • [ -k file ]:如果file文件存在且已经设置了粘制位则为真;
  • [ -r file ]:如果file文件存在且可读则为真;
  • [ -s file ]:如果file文件存在且大小不为0则为真;
  • [ -t file ]:如果文件描述FD打开且指向一个终端则为真;
  • [ -u file ]:如果file文件存在且设置了SUID(set user ID)则为真;
  • [ -w file ]:如果file文件存在且可写则为真;
  • [ -x file ]:如果file文件存在且可执行则为真;
  • [ -O file ]:如果file存在且属有效用户ID则为真;
  • [ -G file ]:如果file存在且属有效用户组则为真;
  • [ -L file ]:如果file存在且是一个符号连接则为真;
  • [ -N file ]:如果file存在 and has been mod如果ied since it was last read则为真;
  • [ -S file ]:如果file存在且是一个套接字则为真;
  • [ -z string ]string 的长度为零则为真;

操作案例

# 如果test1为目录返回yes,否则为no
[root@localhost shell]# [ -d test1 ] && echo yes || echo no
yes
# 如果test2.txt为普通文件类型返回yes,否则为no
[root@localhost shell]# [ -f test2.txt ] && echo yes || echo no
yes
# 如果test2.txt文件存在且可读返回yes,否则为no
[root@localhost shell]# [ -r test2.txt ] && echo yes || echo no
yes
# 如果test2.txt文件存在且可执行返回yes,否则为no
[root@localhost shell]# [ -x test2.txt ] && echo yes || echo no
no
# 如果test2.txt文件存在且大小不为0返回yes,否则为no
[root@localhost shell]# [ -s test2.txt ] && echo yes || echo no
no

2.2 字符串判断表达式

  • str1 = str2:两个字符串完全相等为真;
  • str1 != str2:两个字符串不完全相等为真;
  • -n str1:当串的长度大于0时为真(非空为真);
  • -z str1:当串的长度为0时为真(空为真);
  • str1:当串str1为非空时为真;

操作案例

# 字符串长度不为0返回yes,否则为no
[root@localhost shell]# [ -n "hello" ] && echo yes || echo no
yes
# 字符串长度为0返回yes,否则为no
[root@localhost shell]# [ -z "" ] && echo yes || echo no
yes
# 字符串完全相同返回yes,否则为no
[root@localhost shell]# [ "Hello"="hello" ] && echo yes || echo no
yes

2.3 数字判断表达式

  • eq:等于;
  • ne:不等于;
  • gt:大于;
  • lt:小于;
  • ge:大于等于;
  • le:小于等于;

操作案例

# 若5大于3返回yes,否则为no
[root@localhost ~]# [ 5 -gt 3 ] && echo yes || echo no
yes
# 若id -u返回等于0返回admin,否则返回other
[root@localhost ~]# [ `id -u` -eq 0 ] && echo admin || echo other
admin

2.4 文件判断表达式

  • -r file:用户可读为真;
  • -w file:用户可写为真;
  • -f file:文件为普通文件为真;
  • -x file:用户可执行为真;
  • -d file:文件为目录为真;
  • -c file:文件为特殊字符文件为真;
  • -s file:文件大小非0为真;
  • -b file:文件为块特殊文件为真;
  • -t file:文件描述符(默认1)指定的设备为终端时为真;

操作案例

# /etc/hosts为普通文件且/etc/services为普通文件返回yes,否则为no
[root@localhost ~]# [ -f /etc/hosts -a -f /etc/services ] && echo yes || echo no
yes

[root@localhost ~]# ll /etc/hosts
-rw-r--r--. 1 root root 158 Sep 10  2018 /etc/hosts
[root@localhost ~]# ll /etc/services
-rw-r--r--. 1 root root 692252 Oct 30  2019 /etc/services

2.5 表达式中[ ]与[[ ]]的区别

  • [ ]是bash里test的同义词,如[ -d filename ]test -d filename的返回结果是一样的,[ ] 可用的字符串比较运算符只有 == != ;整数比较运算符只能使用 -eq-ne-le-ge-lt-gt 六种;对于字符串的比较可以使用转义字符进行转义大于小于号,如 [ ab \\< bc ] ,结果为真,返回为0
  • [[ ]] 是shell中的一个内置命令,比 [ ] 通用并强大;逻辑测试使用 && || ;使用 =~ 操作符支持正则表达式;在[[ ]]内可以使用-eq等操作符进行非整数比较, [[ ]] 将非整数的字符串转换成为 0( ),不会检查报错内容;
  • [ ][[ ]]都不支持+ - * /数学运算符;

2.5.1 [ ]的逻辑判断表达式

  • -a :与;
  • -o :或;
  • ! :非;
  • !=:不等;

操作案例

read -p "Enter a number: " aaa
# -o 为或关系
if [ $aaa -lt 1 -o $aaa -gt 99 ]; then
    echo "小于1或大于99"
else
	echo "大于1小于99"

2.5.2 [[ ]]的逻辑判断表达式

  • && :前面命令执行失败,后面命令不执行;
  • || :前面命令执行成功,后面命令不执行;前面执行失败后面命令执行;
  • =~:匹配(正则表达式);
# 若文件/etc/passwd存在则返回1否则返回2
[root@localhost shell]# cat /etc/passwd > /dev/null && echo "1" || echo "2"
1

以上是关于Shell ❀ 条件测试语句的主要内容,如果未能解决你的问题,请参考以下文章

Shell-条件测试和判断语句

Shell-条件测试和判断语句

Shell脚本条件测试if语句case语句!

shell脚本——编程条件语句(条件测试if语句case分支语句)

Shell编程之条件语句

Shell条件测试)