shell 笔记 之测试选项、测试命令
简单的测试:
#!/bin/bash echo 文件比较运符 echo 运算符 描述 示例 echo -e filename 如果 filename存在,则为真 [ -e /var/log/syslog ] echo -d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ] echo -f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ] echo -L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ] echo -r filename 如果 filename可读,则为真 [ -r /var/log/syslog ] echo -w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ] echo -x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ] echo filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ] echo filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ] echo 字符串比较运算符 echo -z string 如果 string长度为零,则为真 [ -z "$myvar" ] echo -n string 如果 string长度非零,则为真 [ -n "$myvar" ] echo string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ] echo string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ] echo 算术比较运算符 echo num1-eq num2 等于 [ 3 -eq $mynum ] echo num1-ne num2 不等于 [ 3 -ne $mynum ] echo num1-lt num2 小于 [ 3 -lt $mynum ] echo num1-le num2 小于或等于 [ 3 -le $mynum ] echo num1-gt num2 大于 [ 3 -gt $mynum ] echo num1-ge num2 大于或等于 [ 3 -ge $mynum ]
用test命令、[[ ]] 进行更复杂的测试:
#!/bin/bash # test expr 和 [ expr ] 是等价的;可以用$?检查返回值;可以使用&&和||操作返回值 test 3 -gt 4 && echo true || echo false # 可以使用-eq, -ne, -lt, -le, -gt, -ge 比较算术值。 # 可以使用操作符=, !=, <, > 比较字符串是否相等,不相等或者第一个字符串的排序在第二个字符串的前面或后面。 # 单目操作符-z 测试null字符串; # 由于shell也用< >操作符进行重定向,所以必须使用\< \> 加以转义。 [ "abc" != "def" ];echo $? [ "abc" \< "ab" ];echo $? [ "abc" \> "abcd" ];echo $? # -a和-o选项允许使用逻辑运算符AND和OR将表达式组合在一起。单目操作符!是逻辑非。 # shell通常要在子shell中运行括号中的表达式,所以需要用\( \)转义括号,或者把这些操作符括在单引号或双引号内。 # test "a" = "a" -a 3 -lt 4 ; echo $? test "a" != "b" -a 3 -ge 4 ; echo $? [ ! \( "a" = "a" -o 3 -lt 4 \) ]; echo $? [ ! \( "a" = "a" -o 3 -lt 4 ")" ]; echo $? # (( 和 [[ # (( expr )) 复合命令计算算术表达式,如果表达式求值为0,则设置推出状态为1; # 如果求值为非0,则设置为0. # 不需要对(( )) 之间的操作符转义。可执行C语言中常见的算术、逻辑和位操作。 # 算术只对整数进行。 let x=2 y=2**3 z=y*3 echo $x $y $z (( w=y/x + ( (~ ++x) & 0xf) )); echo $? $x $y $w # (( w=y/x + ( (~ ++x) & 0xf ) )); echo $? $x $y $w # [[ ]] 可以对文件名和字符串使用更自然的语法。 [[ (-d "`pwd`") && (-w "`pwd`") ]] && echo "`pwd` is writable directory" # 在使用= 或 != 操作符时,符合命令[[ 还能在字符串上进行模式匹配。 [[ "abc def .d,x--" = a[abc]*\ ?d* ]]; echo pattern match $? [[ "abc def c--" = a[abc]*\ ?d ]]; echo pattern match $? [[ "abc def d,x" = a[abc]*\ d* ]]; echo pattern match $?
相关推荐
laisean 2020-11-11
Julyth 2020-10-16
laisean 2020-09-27
flycappuccino 2020-09-27
liguojia 2020-09-27
tianhuak 2020-11-24
huha 2020-10-16
lianshaohua 2020-09-23
zhangjie 2020-11-11
大牛牛 2020-10-30
firefaith 2020-10-30
liguojia 2020-10-20
wangzhaotongalex 2020-10-20
以梦为马不负韶华 2020-10-20
CARBON 2020-10-20
彼岸随笔 2020-10-20
lianshaohua 2020-10-20
yutou0 2020-10-17
JohnYork 2020-10-16