文章目录
- if else 值比较
- if 逻辑测试
- if test
- if [] 与[[]]
- if字符串比较校验
- if文件校验
- case基本结构
- case字符串
- case或(|)
- case通配符
- case 通配符组合使用
if else 值比较
注意:if []中两边有空格,if和中括号之间也有空格,变量=两边无空格
比较符号 | 说明 |
---|---|
-eq | 等于Equal |
-ne | 不等于Not Equal |
-lt | 小于Lesser Than |
-le | 小于等于Lesser or Equal |
-gt | 大于Greater Than |
-ge | 大于等于Greater or Equal |
逻辑运算or(||、-o) and(&&、-a)
then可以另起行:
#!/bin/bashage=$1
if [ $age -ge 20 ] && [ $age -lt 30 ]
then echo "年轻人"
elif [ $age -ge 30 ] && [ $age -lt 60 ]
then echo "青年人"
else echo "老年人"
fi
如果if和then同行,得加分号(😉
#!/bin/bashage=$1
if [ $age -ge 20 ] && [ $age -lt 30 ]; thenecho "年轻人"
elif [ $age -ge 30 ] && [ $age -lt 60 ]; thenecho "青年人"
else echo "老年人"
fi
推荐then单独占一行,并且提供缩进,这样看起来更美观一点:
#!/bin/bashage=$1
if [ $age -ge 20 ] && [ $age -lt 30 ]
then echo "年轻人"
elif [ $age -ge 30 ] && [ $age -lt 60 ]
then echo "青年人"
else echo "老年人"
fi
if 逻辑测试
#!/bin/bashenglish=$1
math=$2if [ $english -ge 90 ] && [ $math -gt 90 ];thenecho "优秀"
elif [ $english -ge 90 ] || [ $math -gt 90 ];thenecho "请继续加油哦"
else echo "努力吧,少年"
fiif [ $english -ge 90 -a $math -gt 90 ];thenecho "优秀"
elif [ $english -ge 90 -o $math -gt 90 ];thenecho "请继续加油哦"
else echo "努力吧,少年"
fi
注意:
- &&、||是在命令之间,2个[]之间,[xx] && [xx]
- -a -o在一个[]之内,[ xx -o xx ]
if test
可以使用test来代替中括号([])
#!/bin/bashenglish=$1
math=$2if test $english -ge 90 -a $math -gt 90;thenecho "优秀"
elif test $english -ge 90 -o $math -gt 90;thenecho "请继续加油哦"
else echo "努力吧,少年"
fi
if [] 与[[]]
简单点说,[[]]是bash扩展,比[]支持更多,如:
- 数字比较可以使用==、!=、<、<=、>、>=
- 变量和字符串的引号可以省略
- 支持正则匹配
[[]]支持正则匹配很多时候就非常方便了:
#!/bin/bashstr="Hello World"# 是否包含子串
if [[ $str == *World* ]]; thenecho "$str 包含子串:World"
elseecho "$str 不包含子串:World"
fi# 模式匹配
if [[ $str =~ ^Hello.*World$ ]]; thenecho "匹配成功"
elseecho "匹配失败"
fi
#!/bin/bashv1="zabc"
v2="z*"echo "变量v1:$v1"
echo "变量v2:$v2"if [[ older == old?? ]];thenecho "[[]]模式匹配成功"
elseecho "[[]]模式匹配失败"
fiif [ older == old?? ];thenecho "[]模式匹配成功"
elseecho "[]模式匹配失败"
fiif [[ $v1 == z* ]];thenecho "\$v1 == \"z*\":模式匹配z*,成功"
elseecho "\$v1 == \"z*\":模式匹配z*,失败"
fiif [[ $v1 == "z*" ]];thenecho "\$v1 == \"z*\":精确匹配字符z*,成功"
elseecho "\$v1 == \"z*\":精确匹配字符z*,失败"
fiif [[ $v2 == "z*" ]];thenecho "\$v2 == \"z*\":精确匹配字符z*,success"
elseecho "\$v2 == \"z*\":精确匹配字符z*,failure"
fiif [[ "$v1" < "$v2" ]];thenecho "[[]]<不需要转义,>="
elseecho "[[]]<不需要转义,<"
fiif [ "$v1" \< "$v2" ];thenecho "[]<需要转义,>="
elseecho "[]<需要转义,<"
fi
if字符串比较校验
比较符号 | 说明 |
---|---|
-z str | 如果str长度为零,则为真 |
-n str | 如果str长度非零,则为真 |
str1 = str2 | 相等,则为真 |
str1 != str2 | 不等,则为真 |
#!/bin/bashfunction log() {if [ -z $2 ];thenecho "错误message"fiif [ -n $2 ];thenecho "message长度:${#1}"fiif [ $1 == "info" ]; thenecho -e "info\t$2"elif [ $1 == "error" ]; thenecho -e "error\t$2"elif [ $1 == "debug" ]; thenecho -e "debug\t$2"fi
}log info
log error "出错了"
if文件校验
比较符号 | 说明 |
---|---|
-e filename | filename存在,则为真 |
-d filename | filename为目录,则为真 |
-f filename | filename为常规文件,则为真 |
-L filename | filename为符号链接,则为真 |
-r filename | filename可读,则为真 |
-w filename | filename可写,则为真 |
-x filename | filename可执行,则为真 |
-s filename | filename大小不为0,则为真 |
f1 -nt f2 | 如果文件f1比f2新,则为真 |
f1 -ot f2 | 如果文件f1比f2旧,则为真 |
test目录不存在(通过检查是否是目录的方式),创建目录:
#!/bin/shdir="test"
if [ ! -d $dir ]; thenecho "$dir 不存在,创建目录"mkdir "$dir"
elseecho "$dir 目录已经存在"
fi
文件不存在,创建文件:
#!/bin/shvimConfig=~/.vimrcif test ! -f "$vimConfig"; thenecho "vim配置文件不存在,创建文件"echo "set nu" > $vimConfig
elseecho "vim配置文件已经存在"
fiif test -s "$vimConfig"; thenecho "vim配置文件不为空"
elseecho "vim配置文件空,为配置文件设置显示行号"echo "set nu" > $vimConfig
fi
case基本结构
#!/bin/bashnum=2case $num in
1) echo "the num is one"
;;
2) echo "the num is two"
;;
*) echo "the num is not one two"
esac
- ;;固定结果,相当于break
- *)相当于default
case字符串
#!/bin/bashstr="aaa"case $str in
aaa)echo "优秀"
;;
bbb)echo "中等"
;;
ccc)echo "及格"
;;
ddd)echo "不及格"
;;
*)echo "WTF"
esac
case或(|)
#!/bin/bashop="s"case $op in
yes|YES|y|Y)echo "选择yes";;
no|NO|n|N)echo "选择no";;
esac
case通配符
支持*、? []
#!/bin/bashstr="1"case "$str" in
[a-z]|[A-Z])echo "你输入1个字母"
;;
[0-9])echo "你输入1个数字"
;;
*)echo "你输入的是其他字符"
esacstr="123"case "$str" in
[a-z]|[A-Z])echo "你输入1个字母"
;;
[0-9])echo "你输入1个数字"
;;
*)echo "你输入的是其他字符"
esac
shell中没有不能匹配个数,类似于正则[0-9]{3,7}这种
case 通配符组合使用
#!/bin/bashcase $1 in
*.txt)echo "这是一个文本文件";;
*.jpg | *.png)echo "这是一个图形文件";;
????.xlsx)echo "这是4个字符的Excel文件"
;;
*)echo "该文件不符合需求"
esac