Shell ❀ 条件测试语句
Posted 无糖可乐没有灵魂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell ❀ 条件测试语句相关的知识,希望对你有一定的参考价值。
文章目录
三、条件测试
1、基本语法
在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假,当指定的条件为真时,整个条件测试的返回值为0
;反之如果为假,则条件测试语句的返回值为非0
值。
命令格式1:test 条件表达式
命令格式2:[ 条件表达式 ]
命令格式3:[[ 条件表达式 ]]
# [ ]的两边需要存在空格
2、表达式
命令格式:
[ 操作符 文件或目录 ]
2.1 条件判断表达式
[ -a file ]
:如果file
文件存在则为真;[ -b file ]
:如果file
文件存在且是一个特殊文件则为真(文件类型分为七种,分别是:-
、b
、c
、d
、l
、p
、s
;-
为普通文件类型,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 ❀ 条件测试语句的主要内容,如果未能解决你的问题,请参考以下文章