bash测试test详解
概述
- 任何相对完整的计算机语言都能够测试某个条件,然后根据测试的结果采取不同的动作。对于测试条件, Bash使用test命令、各种方括号和圆括号、if/then结构等来测试条件。
7.1. Test Constructs
- 一个if/then语句结构测试一个或多个命令的退出状态是否为0(因为在unix系统中0表示'执行成功'), 如果为0,就执行语句后面的命令。
- Bash中有个专用的命令叫[(左中括号,bash特殊字符之一)。它是内置命令test别名,为提升效率 其同时也是bash的内置命令。该命令视其接受的参数为比较表达式或文件测试(测试文件是否存在、 文件类型、文件权限等)并且返回一个对应于比较结果的退出状态(如果比较或测试结果为真则返回0,否则返回1)。
- 在bash2.02版本中,bash新增了[[ ... ]]叫扩展的test测试命令,其进行比较时更贴合其他编程语言 的风格。需要注意的是[[是一个bash关键字而非命令。bash视[[ a−ltb ]]为单个元素,返回一个退出状态。
[root@centos8 ~]#type [[
[[ is a shell keyword
[root@centos8 ~]#type [
[ is a shell builtin
[root@centos8 ~]#type test
test is a shell builtin
[root@centos8 ~]#which [
/usr/bin/[
[root@centos8 ~]#which test
/usr/bin/test
[root@centos8 ~]#a=3
[root@centos8 ~]#b=4
[root@centos8 ~]#[[ $a -lt $b ]]
[root@centos8 ~]#echo $?
0
[root@centos8 ~]#a=5
[root@centos8 ~]#[[ $a -lt $b ]]
[root@centos8 ~]#echo $?
1
- '(( ... ))' 和 'let ...' 结构用来进行简单的数学运算,也会返回一个退出状态,退出状态决定于其里面的 算术表达式展开后的结果是否是非0值。这些算术运算展开结构可能会被用来进行算术比较。
(( 0 && 1 ))
echo $?
let "num = (( 0 && 1 ))"
echo $num
let "num = (( 0 && 1 ))"
echo $?
(( 200 || 11 ))
echo $?
let "num = (( 200 || 11 ))"
echo $num
let "num = (( 200 || 11 ))"
echo $?
(( 200 | 11 ))
echo $?
let "num = (( 200 | 11 ))"
echo $num
let "num = (( 200 | 11 ))"
echo $?
- "let" 结构和双圆括号的返回状态相同。
- 注意:某个算术表达式的退出状态不是该算术表达式计算错误的值。
var=-2 && (( var+=2 ))
echo $?
var=-2 && (( var+=2 )) && echo $var