Shell 判断表达式

test

测试的标志 代表意义
1. 关于某个文件名的“文件类型”判断,如test -e filename表示存在否
-e 该“文件名”是否存在? (常用)
-f 该“文件名”是否存在且为文件(file) ? (常用)
-d 该“文件名”是否存在且为目录(directory) ? (常用)

示例:

[root@localhost ~]# touch a.txt
[root@localhost ~]# test -e a.txt;echo $?
0                               # 测试成功,命令返回值为 0

[root@localhost ~]# test -e b.txt;echo $?
1                               # 测试失败,命令返回值为 非 0

[root@localhost ~]# test -f a.txt;echo $?
0

[root@localhost ~]# test -d a.txt;echo $?
1

测试的标志 代表意义
2. 关于文件的权限侦测,如test -r filename表示可读否(但root权限常有例外)
-r 侦测该文件名是否存在且具有“可读”的权限?
-w 侦测该文件名是否存在且具有“可写”的权限?
-x 侦测该文件名是否存在且具有“可执行”的权限?
-u 侦测该文件名是否存在且具有“SUID”的属性?
-g 侦测该文件名是否存在且具有“SGID”的属性?
-k 侦测该文件名是否存在且具有“Sticky bit"的属性?
-s 侦测该文件名是否存在且为“非空白文件”?

示例:

[root@localhost ~]# test -r a.txt; echo $?
0

[root@localhost ~]# test -x a.txt; echo $?
1

[root@localhost ~]# test -w a.txt; echo $?
0

[root@localhost ~]# test -u a.txt; echo $?           # 判断 a.txt 文件是否具有 SUID 属性
1

[root@localhost ~]# cat a.txt                        # 查看 a.txt ,此文件内容为空

[root@localhost ~]# test -s a.txt; echo $?           # 判断 a.txt 文件中有内容
1                                                    # 命令返回值为 1 ,说明文件中没有内容

[root@localhost ~]# echo "123" > a.txt

[root@localhost ~]# test -s a.txt; echo $?
0

测试的标志 代表意义
3. 两个文件之间的比较,如:test file1 -nt file2
-nt (newer than) 判断 file1是否比 file2 新
-ot (older than) 判断 file1 是否比 file2 旧
-ef 判断 file1与 file2 是否为同一文件,可用在判断 hard link 的判定上,主要意义在判定,两个文件是否均指向同一个inode里

示例:

[root@localhost ~]# touch b.txt

[root@localhost ~]# ls -l a.txt
-rw-r--r--. 1 root root 0 2月  25 21:08 a.txt

[root@localhost ~]# ls -l b.txt
-rw-r--r--. 1 root root 0 2月  25 21:10 b.txt

[root@localhost ~]# test a.txt -nt b.txt; echo $?         # 判断 a.txt 是否比 b.txt 新
1                                                         # 返回 1, 表示判断表达式不成立

[root@localhost ~]# test b.txt -nt a.txt; echo $?
0

[root@localhost ~]# ll -i a.txt b.txt
8409154 -rw-r--r--. 1 root root 0 2月  25 21:08 a.txt
8409154 -rw-r--r--. 1 root root 0 2月  25 21:10 b.txt

[root@localhost ~]# test a.txt -ef a-hard.txt; echo $?           #判断是否为同一文件
0                                                                #返回 0,表示为同一文件

测试的标志 代表意义
4. 关于两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大于 n2 (greater than)
-It n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)

示例:

[root@localhost ~]# test 10 -eq 20; echo $?
1

[root@localhost ~]# n1=10

[root@localhost ~]# n2=20

[root@localhost ~]# test $n1 -eq $n2; echo $?
1

[root@localhost ~]# test $n1 -lt $n2; echo $?
0

[root@localhost ~]# test $n1 -ne  $n2; echo $?
0

测试的标志 代表意义
5. 判定字串的数据
test -z string 判定字串是否为0,若 string 为空字串,则为 true
test ! -z string 判定字串是否非为0,若 string 为空字串,则为 false
test str1 == str2 判定 str1 是否等于 str2,若相等,则回传 true
test str1 != str2 判定 str1 是否不等于 str2,若相等,则回传 false

注意:
这里的 string 可以是实际的字符串,也可以是一个变量
这里说的字符串是否为 0 的意思是 字符串的长度是否为 0

示例:

[root@localhost ~]# test -z ''; echo $?      # 空字符串
0

[root@localhost ~]# test -z ' '; echo $?      # 含有一个空格的字符串
1

[root@localhost ~]# test ! -z ' '; echo $?   # 判断含有一个空格的字符串,其长度为非0的字符串, 空格也算是字符串
0

[root@localhost ~]# test -z ${name}; echo $?   # 变量未定义,shell 中认为其长度为 0
0

[root@localhost ~]# name=chen

[root@localhost ~]# test -z ${name}; echo $?
1

[root@localhost ~]# age=''                        # 定义变量,并且赋值为空字符串

[root@localhost ~]# test -z ${age}; echo $?    # shell 中,被赋值为空字符串的变量长度也为 0
0

[root@localhost ~]# name=chen
[root@localhost ~]# age=18
[root@localhost ~]# test $name == $age;echo $?
0
[root@localhost ~]# test $name != $age;echo $?
1

注意:
再次强调一下, 在 shell 中,以下两种情况,变量的长度均视为 0

  • 变量未定义
  • 变量定义了,但赋值为空字符串,比如 a='' , b=""

测试的标志 代表意义
6. 多重条件判定,例如:test -r filename -a -x filename
-a (and) 两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传true
-o (or) 两状况任何一个成立!例如 test -r file -o -xfile,则 file 具有 r 或 x 权限时,就可回传true
! 反相状态,如test ! -x file, 当file不具有 x 时,回传true

示例:

[root@localhost ~]# ls -l a.txt
-rwxr-xr-x. 1 root root 0 2月  25 21:08 a.txt

[root@localhost ~]# test -r a.txt -a -x a.txt; echo $?
0

[root@localhost ~]# test -u a.txt -o -r a.txt; echo $?
0

-u 是否有SUID属性,这个条件为 fasle
-r 是否有可读属性,这个条件为 true
-o 两边任何一方返回true,最终整个判断表达式就返回true

判断符号 []

[root@localhost ~]# [ -z "${HOME}" ] ; echo $?         # 判断$HOME是否为空字段,
0                                                      #是空字段
  • 必须要注意中括号的两端需要有空白字符来分隔
  • 在中括号 [] 内的每个元素之间都需要用空格来分隔;
  • 在中括号内的变量,最好都以双引号括号起来;
# 定义变量
[root@localhost ~]# name="chen"

# 开始测试值是否相等
[root@localhost ~]# [ "${name}" == "chao" ]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,224评论 6 529
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,916评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,014评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,466评论 1 308
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,245评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,795评论 1 320
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,869评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,010评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,524评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,487评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,634评论 1 366
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,173评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,884评论 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,282评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,541评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,236评论 3 388
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,623评论 2 370

推荐阅读更多精彩内容

  • shell脚本 一、什么是 shell script shell script 是利用 shell 的功能所写的一...
    胖虎喜欢小红阅读 383评论 0 4
  • 以下列举的都是常用表达式: 文件判断表达式:-e:文件是否存在-d:目录是否存在 字符串判断表达式:-n $str...
    吃橘子的冬天阅读 213评论 0 0
  • shell-6-判断表达式 test 判断符号 在中括号 [] 内的每个元件都需要有空白键来分隔在中括号内的变量,...
    _str_阅读 192评论 0 0
  • 关于某个文件名的“文件类型”判断,如test -e filename 表示存在否 -e 该“文件名”是否存在...
    mejhwu阅读 847评论 0 0
  • 此篇文章内容是我很久以前在印象笔记中的一个知识总结,大概122个Linux指令。如今,写出来就当再回顾一遍了。若有...
    StephenZhang01阅读 1,077评论 0 5