总第1篇
test
test就是测试的意思,常用在流程控制语句中作为条件。下面做一下介绍。
测试整数
整数的test就是大小关系的比较,与其他语言不同,Bash中没有使用<,>来做大于等于号,而是使用了减号开头的选项来比较。
假如有两个整数变量a和b。那么比较a是否大于b,就写作 test $a -gt $b ,符合条件返回真值1。实际在终端里测试的时候可以这样写来看test语句的执行结果
如果条件成立打印 Yes,不成立不打印。
全部的关系比较选项为:
选项 | 描述 | 英文全称 |
eq | 等于 | equal |
gt | 大于 | greater than |
lt | 小于 | less than |
ne | 不等于 | not equal |
ge | 大于等于 | greater or equal |
le | 小于等于 | less or equal |
Bash脚本,或者说Shell终端中的各种命令都有很丰富的选项,所以我建议在记忆的时候要去记忆它的英文全称,理解了它的含义,这样反而会降低记忆的难度。
测试字符串
字符串的测试无非就是包括,判断两个字符串是否相等,判断一个字符串是否为空。
假设str1和str2是持有两个字符串的变量(直接测试两个字符串,而非字符串变量时,则不加$,这很好理解)。具体用法为:
test $str1 = $str2 | 测试是否相等,相等返回1 |
test $str1 != $str2 | 测试是否不等,不等返回1 |
test $str1 \< $str2 | 如果str1的字典序在str2之前,则返回1 |
test $str1 \> $str2 | 如果str1的字典序在str2之后,则返回1 |
test $str1 | 如果不为空返回1 |
test -n $str1 | 如果不为空返回1 |
test -z $str1 | 如果是空串,返回1 |
关于字典序的那两个比较,其实就是大于号 > 和小于号 <。因为bash中这两个符号有重定向的意思,所以这里要使用反斜杠\ 转义。
选项-n是 nonzero 的缩写。选项-z是 zero 的缩写。这样好记忆了吧
测试文件
测试文件需要用到大量的选项,这里我只写一个常用的,其他的大家自行 man test
针对单个文件
选项 |
描述 |
d | 是否为目录 |
f | 是否为普通文件 |
x | 是否有执行权限 |
r | 是否有读权限 |
w | 是否写读权限 |
e | 是否存在 |
s | 文件大小是否大于0 |
c | 是否为字符设备文件 |
b | 是否为块设备文件 |
以上条件在成立的时候返回真值1。具体用法比如:
- 01.test -f hello.c
- 02.test -d /home
- 03....
针对两个文件
用法 | 描述 |
test file1 -nt file2 | 测试file1的修改时间是不是比file2 new(晚) |
test file1 -ot file2 | 测试file1的修改时间是不是比file2 old(早) |
test file1 -ef file2 | 测试两者是相同的设备和具有相同的结点(inode)数 |
同样的,若是条件成立则返回真值1。注意这里的file1,file2就是文件名的字符串了。
- 01.#可以直接
- 02.test a.c -nt b.c
- 03.#或者是
- 04.a=a.c
- 05.b=b.c
- 06.test $a -nt $b
不再细表。
逻辑运算
逻辑运算就是与或非。
- -a 逻辑与
- -o 逻辑或
- ! 逻辑非
用法如:
- 01.test $a -lt $b -a $a -gt $c
- 02.test $a -lt $b -o $a -gt $c
- 03.test ! -d sleep.sh && echo Yes #如果sleep.sh不是目录,就打印Yes
其实完整版是这样:
- 01.test $a -lt $b -a test $a -gt $c
- 02.test $a -lt $b -o test $a -gt $c
简化版test
在读完这一部分后,你可能会惊呼,怎么不早点告诉我。哈哈。
其实以上所有的test命令都可以用方括号替换。比如
test -f hello.c
可以换成
[ -f hello.c ]
怎么样,很方便吧。注意的是,方括号和表达式前后各有一个空格间隔哦。不要丢掉。实际也就是 [空格-f hello.c空格]
其他注意的地方是方括号的逻辑表达式,比如
test $a -lt $b -a $a -gt $c
可以转化为
[ $a -lt $b -a $a -lt $c ]
或者分开作为两条语句
[ $a -lt $b -a ]&&[ $a -lt $c ]
这个&&并无什么特别之处,并非方括号运算所独有。此处就是当前面语句为真时,接着执行后面的语句。所有的Bash语句都可以用&&或||连接。
原文链接:http://blog.csdn.net/guodongxiaren/article/details/38014669