Shell 条件测试

文件测试

数值比较

字符串比较

表达式比较

  正则匹配

  判断变量是否是数字

  示例

  奇怪的符号

  执行脚本

  调试脚本

 

Shell 条件测试

格式1:test 条件表达式

格式2:[ 条件表达式 ]

格式3:[[ 条件表达式 ]]

man test

 

1. 文件测试 [ 操作符 文件或目录 ]

~ » test -d /home
~ » echo $?
0
~ » test -d /home11111
~ » echo $?
1
~ » [ -d /home ]

[ -e dir|file ] 文件存在
[ -d dir ]      文件存在且为目录
[ -f file ]     文件存在且为普通文件
[ -r file ]     指定文件存在且具备读取权限
[ -x file ]     文件存在且被授予执行(或搜索)权限
[ -w file ]     文件存在且被赋予了写权限
[ -L file ]     指定文件存在且为符号链接(等效于-h)
~ » [ ! -d ./aaa ] && mkdir -v ./aaa
mkdir: 已创建目录 "./aaa"
~ » [ -d ./aaa ] || mkdir -v ./abc

2. 数值比较 [ 整数1 操作符 整数2 ]

[ 1 -gt 10 ]  -gt:greater than(大于)
[ 1 -lt 10 ]  -lt:less than(小于)
[ 1 -eq 10 ]  -eq:equal(相等)
[ 1 -ne 10 ]  -ne:not equal(不等)
[ 1 -ge 10 ]  -ge:greater than or equal(大于或等于)
[ 1 -le 10 ]  -le:less than or equal(小于或等于)

~ » disk_use=$(df -h |grep '/$' | awk '{print $(NF-1)}'|awk -F% '{print $1}')
~ » [ $disk_use -ge 80 ] && echo "war...."

~ » id -u
0
~ » [ $(id -u) -eq 0 ] && echo "is root"
is root
~ » [ $(id -u) -eq 0 ] && echo "is root" || echo "south not root"
south not root

C语言风格的数值比较
~ » ((1<2));echo $?
0
~ » ((1==2));echo $?
1
~ » ((1>2));echo $?
1
~ » ((1>=2));echo $?
1
~ » ((1<=2));echo $?
0
~ » ((1!=2));echo $?
0
~ » ((`id -u`>0));echo $?
0
~ » (($UID==0));echo $?
1

3. 字符串比较

提示:使用双引号

-n 字符串
       字符串长度非零
STRING 等价于 -n 字符串
-z 字符串
       字符串的长度为 0
字符串1 = 字符串2
       字符串相等
字符串1 != 字符串2
       字符串不相等

~ » [ "$USER" = "root" ];echo $?
0
~ » [ "$USER" != "root" ];echo $?
1

~ » aaa=""
~ » echo ${#aaa}
0
~ » [ -z "$aaa" ];echo $?     字符串的长度为 0
0
~ » [ -n "$aaa" ];echo $?     字符串长度非零
1

-------------------------
~ » var1=111
~ » var2=
~ »           //var3变量未定义
~ » echo ${#var1}
3
~ » echo ${#var2}
0
~ » echo ${#var3}
0
~ » [ -z "$var1" ];echo $?
1
~ » [ -z "$var2" ];echo $?
0
~ » [ -z "$var3" ];echo $?
0
~ » [ -n "$var1" ];echo $?
0
~ » [ -n "$var2" ];echo $?
1
~ » [ -n "$var3" ];echo $?
1
小结:变量为空 或 为定义 ”长度都为0“

4. 表达式比较

表达式被省略,则默认为假。否则,表达式可能为真或假,且以此设置返回状态。可能出现的情况如下所示:
( 表达式 )
       表达式为真
! 表达式
       表达式为假
表达式1 -a 表达式2
       表达式1 与表达式2 皆为真
表达式1 -o 表达式2
       表达式1 或表达式2 为真

~ » [ "$USER" = "root" ];echo $?
1
~ » [ "$USER" = "v_nanruosen" ];echo $?
0
~ » [ "$USER" != "v_nanruosen" ];echo $?
1

~ » [ 1 -lt 2 -a 5 -gt 10 ];echo $?
1
~ » [ 1 -lt 2 -o 5 -gt 10 ];echo $?
0

~ » [[ 1 -lt 2 && 5 -gt 10 ]];echo $?
1
~ » [[ 1 -lt 2 || 5 -gt 10 ]];echo $?
0
注:二元运算符 -a 和 -o 存在固有的歧义问题。请使用 "test EXPR1 &&test EXPR2" 或 "test EXPR1 || test EXPR2" 作为替代。

正则匹配

~ » [ "$USER" == "root" ];echo $?
0
~ » [ "$USER" =~ ^r ];echo $?
-bash: [: =~: 期待二元表达式
2
~ » [[ "$USER" =~ ^r ]];echo $?  //使用正则
0

判断变量是不是数字

~ » num10=100
~ » num20=10f2ff
~ » [[ "$num10" =~ ^[0-9]*$ ]];echo $?
0
~ » [[ "$num20" =~ ^[0-9]+$ ]];echo $?
1

示例

案例1:
cat num01.sh
#!/bin/bash
#判断用户输入的是否是数字
read -p "请输入一个数值: " num

if [[ ! "$num" =~ ^[0-9]+$ ]];then
    echo "你输入的不是数字! "
    exit
fi
echo "你输入的数字是: $num"


案例2:
cat num02.sh
#!/bin/bash
#判断用户输入的是否是数字
read -p "请输入一个数值: " num

while true
do
    if [[ "$num" =~ ^[0-9]+$ ]];then
        break    # 如果是数字,跳出while循环
    else
        read -p "不是数值,请重新输入数值: " num
    fi
done
echo "你输入的数字是: $num"

 

奇怪的符号

()     子shell中执行
(())   数值比较,运算 C语言
$()    命令替换
$(())  整数运算

{}     集合
${}    变量的引用

[]     条件测试
[[]]   条件测试,支持正则 =~
$[]    整数运算

执行脚本 

./a.sh      需要执行权限     在子shell中执行
bash a.sh   不需要执行权限   在子shell中执行

. a.sh      不需要执行权限   在子shell中执行
source a.sh 不需要执行权限   在子shell中执行
提示:通常修改系统配置文件如 /etc/profile 的PATH等变量后,使之在当前shell中生效。

调试脚本

sh -n a.sh    仅调试syntax error
sh -vx a.sh   以调试的方式执行,查询整个执行过程

 

posted @ 2022-05-16 18:22  南哈哈  阅读(66)  评论(0)    收藏  举报