shell 之 test 命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010376788/article/details/74012565

1. test 命令

test 命令提供了在 if-then 语句中测试不同条件的途径。如果 test 命令中列出的条件成立,test 命令就会退出并返回退出状态码0;如果条件不成立,test 命令就会退出并返回退出状态码1,这样 if-then 语句就会失效。

test 命令的格式非常简单:

test condition

condition 是 test 命令要测试的一系列参数和值。当用在 if-then 语句中时,test 命令看起来是这样的:

if test condition; then
    commands
fi

bash shell 提供了另一种在 if-then 语句中声明 test 命令的方法:

if [ condition ]; then
    commands
fi

方括号定义了 test 命令中用到的条件。注意,你必须在左括号右侧和右括号左侧各加一个空格,否则会报错。

test 命令可以判断3类条件:
1. 数值比较
2. 字符串比较
3. 文件比较

数值比较

test 命令的数值比较功能

比较 描述
n1 -eq n2 检查 n1 是否等于 n2
n1 -ge n2 检查 n1 是否大于或等于 n2
n1 -gt n2 检查 n1 是否大于 n2
n1 -le n2 检查 n1 是否小于或等于 n2
n1 -lt n2 检查 n1 是否小于 n2
n1 -ne n2 检查 n1 是否不等于 n2

注意:test 命令中不能使用浮点数。

字符串比较

test 命令的字符串比较功能

比较 描述
str1 = str2 检查 str1 是否和 str2 相同
str1 != str2 检查 str1 是否和 str2 不同
str1 < str2 检查 str1 是否比 str2 小
str1 > str2 检查 str1 是否比 str2 大
-n str1 检查 str1 的长度是否非 0
-z str1 检查 str1 的长度是否为 0

字符串比较的三大注意事项:
1. 比较的变量最好加上双引号。
2. 大于小于符号必须转义,否则 shell 会把它们当做重定向符号而把字符串值当做文件名。
3. 大于小于顺序和 sort 命令所采用的不同。

#!/usr/bin/env bash

val1=$1
val2=$2

if [ "$val" \> "$val2" ];then
    echo $val1
else
    echo $val2
fi

# 变量不加双引号回报错:
# test.sh: line 6: [: >: unary operator expected

在 test 命令中大写字母会被当成小于小写字母的。但将同样的字符串放进文件中并用 sort 命令排序时,小写字母会先出现。这是由各个命令使用的排序技术不同造成的。test 命令会使用标准的 ASCII 顺序,根据每个字符的 ASCII 数值来决定排序顺序。sort 命令使用的是系统的本地化语言设置中定义的排序顺序。

# sh test.sh Test test
test 

---------
file.txt:
Test
test
---------
# sort file.txt
test
Test

文件比较

test命令的文件比较功能

比较 描述
-d file 检查 file 是否存在并是一个目录
-e file 检查 file 是否存在
-f file 检查 file 是否存储并是一个文件
-r file 检查 file 是否存在并可读
-s file 检查 file 是否存在并非空
-w file 检查 file 是否存在并可写
-x file 检查 file 是否存在并可执行
-O file 检查 file 是否存在并属于当前用户所有
-G file 检查 file 是否存在并且默认组与当前用户相同
file1 -nt file2 检查 file1 是否比 file2 新
file1 -ot file2 检查 file1 是否比 file2 旧

2. 复合条件测试

if-then 语句允许使用布尔逻辑来组合测试:
- 与:[ condition1 ] && [ condition2 ] 或者 [ condition1 -a condition2 ]
- 或:[ condition1 ] || [ condition2 ] 或者 [ condition1 -o condition2 ]
- 非:[ !condition ]

3. if-then 的高级特性

if-then 语句中使用的高级特性:
- 用于数学表达式的双尖括号。
- 用于高级字符串处理功能的双方括号。

使用双尖括号

使用双尖括号格式:

((expression))

双尖括号命令符号

符号 描述
val++ 后增
val– 后减
++val 先增
–val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔与
| 位布尔或
&& 逻辑与
#!/usr/bin/env bash
val1=$1
val2=$2

if (($val1 ** 2 > 100));then
    ((val2 = $val1 ** 2))
    echo $val2
else
    echo $val2
fi

使用双方括号

双方括号命令提供了针对字符串比较的高级特性:

[[ expression ]]

双尖括号里的 expression 使用了 test 命令中采用的标准字符串进行比较。但它提供了 test 命令未提供的另一个特性——模式匹配(Pattern Matching)。

定义正则表达式匹配:

#!/usr/bin/env bash

val=$1

# 匹配所有以 r 开头的字符串
if [[ $val = r* ]];then
    echo $val
else
    echo "Don't match"
fi

4. case 命令

为单个变量寻找特定的值,可以用 case 命令,而不是写那么多的 elif 语句检查。case 命令会检查单个变量列表格式的多个值

case variable in
    pattern1 | pattern2)
        commands1
        ;;
    pattern3)
        commands2
        ;;
    *)
        default commands
        ;;
esac

case 命令会将指定的变量同不同模式进行比较。如果变量和模式是匹配的,那么 shell 会执行为该模式指定的命令。也可以通过竖线操作符来分割模式,在一行列出多个模式。星号会捕获所有跟所有列出的模式都不匹配的值。

#!/usr/bin/env bash

read -p 'Enter what you want: ' USER

case $USER in
    rich | barbara)
        echo "Welcome $USER"
        echo 'Enjoy your visit'
    ;;
    testing)
        echo "Special testing acount"
    ;;
    jessica)
        echo "Don't forget to log off"
    ;;
    *)
        echo "Sorry, you aren't allowed here"
    ;;
esac

猜你喜欢

转载自blog.csdn.net/u010376788/article/details/74012565