参考链接:
- https://blog.youkuaiyun.com/jasonzeng/article/details/53286384
- https://www.tuicool.com/articles/m6zqyq
- https://cnbin.github.io/blog/2015/06/30/bash-tiao-jian-pan-duan/
- http://www.linuxdiyf.com/viewarticle.php?id=105505
IF条件判断
语法模式:
if [ command ]; then
符合该条件执行的语句
fi
#扩展语法:
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
备注说明:
- [ ]表示条件测试。注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格
- 双方括号[[ ]]:是[]的升级功能,包含一些正则匹配等功能。
- 双圆括号(( )):表示数学表达式
- 如果只单独使用>或者<号,系统会认为是输出或者输入重定向,使用时需转义
- 在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开
- 使用-z或者-n来检查长度的时候,没有定义的变量也为0
数值比较
符号 | 数学表示 |
---|---|
-eq | =/== |
-ne | != |
-gt | > |
-ge | >= |
-lt | < |
-le | <= |
在(( ))
中可以直接使用右边的表达式
#脚本
#!/bin/bash
echo "test 1 > 0"
if ((1 > 0));then
echo "1>0"
else
echo "error"
fi
echo "test 1 -gt 0"
if [ 1 -gt 0 ];then
echo "1 -gt 0"
else
echo "error"
fi
if [[ 1 -lt 0 ]];then
echo "error"
else
echo "双括号的使用"
fi
#执行结果
test 1 > 0
1>0
test 1 -gt 0
1 -gt 0
双括号的使用
字符串判断
符号 | 意义 |
---|---|
[ -z STRING ] | STRING的长度为零则返回为真 |
[ -n STRING ] | STRING的长度非零则返回为真 |
[ STRING1 != STRING2 ] | 字符串不相同则返回为真 |
[ STRING1 ] | STRING的长度非零则返回为真 |
[dps@ccod131 bak]$ cat if_string.sh
#!/bin/bash
a=""
b="123"
c="321"
echo "验证字符串判断"
if [ -z "$d" ];then echo "-z 表示字符串为空";fi
if [ -z "$a" ];then echo "验证-z包含字符为空和不存在两种情况";fi
if [ -n "$a" ];then echo "验证a的长度";fi
if [ -n "$b" ];then echo "验证b非空 -n";fi
if [ "$b" != "$c" ];then echo "验证!=的意义";fi
if [ "$c" ];then echo "验证仅输入字符串验证其非空";fi
[dps@ccod131 bak]$ bash if_string.sh
验证字符串判断
-z 表示字符串为空
验证-z包含字符为空和不存在两种情况
验证b非空 -n
验证!=的意义
验证仅输入字符串验证其非空
备注:
- 在测试表达式[]中,字符串需要用“”号引起来;
逻辑判断
符号 | 意义 |
---|---|
[ ! EXPR ] | 逻辑非 |
[ EXPR1 -a EXPR2 ] | 逻辑与 |
[ EXPR1 -o EXPR2 ] | 逻辑或 |
[ ] || [ ] | 用OR来合并两个条件 |
[ ] && [ ] | 用AND来合并两个条件 |
文件判断
符号 | 意义 |
---|---|
[ -a FILE ] | 如果 FILE 存在则为真。 |
[ -b FILE ] | 如果 FILE 存在且是一个块文件则返回为真。 |
[ -c FILE ] | 如果 FILE 存在且是一个字符文件则返回为真。 |
[ -d FILE ] | 如果 FILE 存在且是一个目录则返回为真。 |
[ -e FILE ] | 如果 指定的文件或目录存在时返回为真。 |
[ -f FILE ] | 如果 FILE 存在且是一个普通文件则返回为真。 |
[ -g FILE ] | 如果 FILE 存在且设置了SGID则返回为真。 |
[ -h FILE ] | 如果 FILE 存在且是一个符号符号链接文件则返回为真。 |
[ -k FILE ] | 如果 FILE 存在且已经设置了冒险位则返回为真。 |
[ -p FILE ] | 如果 FILE 存并且是命令管道时返回为真。 |
[ -r FILE ] | 如果 FILE 存在且是可读的则返回为真。 |
[ -s FILE ] | 如果 FILE 存在且大小非0时为真则返回为真。 |
[ -u FILE ] | 如果 FILE 存在且设置了SUID位时返回为真。 |
[ -w FILE ] | 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的) |
[ -x FILE ] | 如果 FILE 存在且是可执行的则返回为真。 |
[ -O FILE ] | 如果 FILE 存在且属有效用户ID则返回为真。 |
[ -G FILE ] | 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组) |
[ -L FILE ] | 如果 FILE 存在且是一个符号连接则返回为真。 |
[ -N FILE ] | 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。 |
[ -S FILE ] | 如果 FILE 存在且是一个套接字则返回为真。 |
[ FILE1 -nt FILE2 ] | 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。 |
[ FILE1 -ot FILE2 ] | 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。 |
[ FILE1 -ef FILE2 ] | 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。 |
[dps@ccod131 bak]$ ls
awk.txt break_continue.sh for_canshu.sh for_c.sh for_list.sh if_file.sh if_number.sh if_string.sh select_1.sh shift.sh until.sh while.sh
# 执行效果
[dps@ccod131 bak]$ bash if_file.sh
awk.txt不具备可执行权限
break_continue.sh具有可执行权限
for_canshu.sh具有可执行权限
for_c.sh具有可执行权限
for_list.sh具有可执行权限
if_file.sh不具备可执行权限
if_number.sh不具备可执行权限
if_string.sh不具备可执行权限
select_1.sh具有可执行权限
shift.sh具有可执行权限
until.sh具有可执行权限
while.sh具有可执行权限
# 脚本
[dps@ccod131 bak]$ cat if_file.sh
#!/bin/bash
for x in *
do
if [ -x "$x" ]
then
echo "${x}具有可执行权限"
else
echo "${x}不具备可执行权限"
fi
done
case语法规则
语法模式
case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列 ;;
esac
注意点:
- case行尾必须为单词“in”,每一个模式必须以右括号“)”结束
- 双分号“;;”表示命令序列结束
- 匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或;最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后 的命令序列