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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步