为了能到远方,脚下的每一步都不能少.|

南哈哈

园龄:3年10个月粉丝:2关注:0

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

 

本文作者:南哈哈

本文链接:https://www.cnblogs.com/nanruosen/p/16277983.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   南哈哈  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起