【四月更文打卡】bash测试test详解

115 阅读2分钟

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视[[ alta -lt b ]]为单个元素,返回一个退出状态。
[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 $?     # 1     ***
# And so ...
let "num = (( 0 && 1 ))"
echo $num   # 0
# But ...
let "num = (( 0 && 1 ))"
echo $?     # 1     ***
(( 200 || 11 ))              # 逻辑或
echo $?     # 0     ***
# ...
let "num = (( 200 || 11 ))"
echo $num   # 1
let "num = (( 200 || 11 ))"
echo $?     # 0     ***
(( 200 | 11 ))               # 逐位或
echo $?                      # 0     ***
# ...
let "num = (( 200 | 11 ))"
echo $num                    # 203
let "num = (( 200 | 11 ))"
echo $?                      # 0     ***
# "let" 结构和双圆括号的返回状态相同。
  • "let" 结构和双圆括号的返回状态相同。
  • 注意:某个算术表达式的退出状态不是该算术表达式计算错误的值。
var=-2 && (( var+=2 ))   # 此处算术表达式值为0,退出状态为1
echo $?                   # 1
var=-2 && (( var+=2 )) && echo $var     # 此处由于算术表达式为0,退出状态为1;bash认为非0的退出状态是命令未执行成功,导致$$后面的echo命令不在执行
                          # Will not echo $var!