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 以调试的方式执行,查询整个执行过程

浙公网安备 33010602011771号