shell 判断
条件/数值测试
- shell 条件测试
测试语法:
test <条件表达式>
[ <条件表达式> ]
[[ <条件表达式> ]]
三种语法都可以用做测试
echo $?
返回判断结果
若为真, 判断返回 0
若为假, 判断返回 1
数值比较:
1 2 3 4 5
| test <整数1> <操作符> <整数2>; echo $?
[ <整数1> <操作符> <整数2> ]; echo $?
[[ <整数1> <操作符> <整数2> ]]; echo $?
|
操作符:
-gt
大于
-lt
小于
-eq
等于
-ne
不等于
-ge
大于等于
-le
小于等于
if 语法结构
流程控制:
if
如果
then
那么
else
否则
fi
结束
1 2 3 4
| if <条件> then <指令> else <指令> fi
|
1 2 3 4 5 6 7 8 9 10
|
read -p "请输入您的密码: " ps if [ ${#ps} -lt 7 ] then echo "你的密码太短!" else echo "您的密码真长!" fi
|
文件测试
操作符:
-f
判断文件是否存在, 是则返回真
-b
判断文件是否是块文件, 是则返回真
-d
判断是否是目录, 是则返回真
-w
判断指定文件或目录是否可写
-x
判断指定文件或目录是否可执行
-e
判断指定文件或目录是否存在
......
文件测试语法
1 2 3 4 5 6 7
|
read -p "请输入要备份的目录: " dir1 if [ -d $dir1 ] then echo "$dir1 存在可以备份" else echo "$dir1 不存在, 无法备份" fi
|
字符串比较
操作符:
=
等于
!=
不等于
-Z
判断字符长度是为 0
-n
判断字符长度不是 0
1 2 3 4 5 6 7 8 9 10
|
read -p "你确定要升级这件装备吗? [yes/no]" select if [ "$select" = "yes" ] then echo "装备升级开始..." else echo "感谢你, 欢迎下次光临!" fi
|
混合测试
操作符:
&&
逻辑和, 等同于 -a
||
逻辑与, 等同于 -o
正则表达式
使用正则表达式开始 =~
模糊查询
判断正则表达式必须使用 [[ ]]
判断
~ [@_!]
表示包含下列字符
1 2 3 4 5 6 7 8 9 10
|
read -p "请你输入密码: " pass if [ ${#pass} -gt 7 ] && [[ $pass =~ [a-z] ]] && [[ $pass =~ [A-Z] ]] && [[ $pass =~ [@_!] ]] then echo "你的密码够复杂" else echo "你的密码太简单" fi
|
##流程控制
if 流程控制
1 2 3 4 5 6 7 8 9
| if [ <命令> ]; then <命令>; fi
if [ <命令> ]; then <命令>; else <命令>; fi
if [ <命令> ]; then <命令>; elif [ <命令> ]; then <命令>;......; fi
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #!/bin/bash
hour=`date+%H`
if [ $hour -ge 6 -a $hour -le 10 ] then echo "现在是早上"
elif [ $hour -ge 11 -a $hour -le 13 ] then echo "现在是中午"
elif [ $hour -ge 14 -a $hour -le 18 ] then echo "现在是下午"
else echo "现在是晚上"
fi
|
嵌套
1 2 3 4 5 6
| if [ <命令> ] then <命令> if [ <命令> ] then <命令> else <命令> fi; ......
|
调试脚本
bash
和 sh
是一个程序
1 2 3 4 5 6 7
| bash -n <shell脚本> sh -n <shell脚本>
sh -xv <脚本文件>
|
模式匹配 CASE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| if [ $action = "[yes/no]" ]
case <变量> in <模式1> ) <命令序列>;;
<模式2> ) <命令序列>;;
<模式3> ) <命令序列>;;
*)
esac
|
例:
1 2 3 4 5 6 7 8 9 10 11
| read -p "输入用户名: " name read -p "确定吗 [yes/no]" action case "$action" in Y|y|Yes|YEs|YES|yES|yeS) id $name echo "用户为: $name" ;; *) echo "thank you" ;; esac
|
附加知识点
输入重定向:
1 2 3 4 5 6 7 8
|
cat << EOF 1. 2. 3. 4. EOF
|