shell脚本条件语句

151 阅读3分钟

条件语句

Shell 环境根据命令执行后的返回状态值($?) 来判断是否执行成功
当返回值为0 (真true)时表示成功,返回值为非0 值(假false) 时表示失败或异常,test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为0表示条件成立)

test命令 测试

测试表达式是否成立,若成立返回0,否则返回其他数值

格式1:test 条件表达式

格式2:[ 条件表达式 ]   #至少有一个空格

注:返回0表示成立,非0值表示条件不成立

文件测试

[ 操作符 文件或目录 ]

常用的测试操作符

命令含义
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-W:测试当前用户是否有权限写入(Write)
-X:测试当前用户是否有权限执行(eXcute)
-L:测试是否为符号链接

整数值比较

[ 整数1 操作符 整数2 ]

常用的测试操作符

命令含义
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

字符串比较

格式1
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]

格式2
[ -z 字符串 ] #是否空值
[ -n 字符串 ] # 字符集是否存在

常用的测试操作符

命令含义
=: 字符串内容相同
!=: 字符串内容不同,! 号表示相反的意思
-z: 字符串内容为空

逻辑测试

格式1[ 表达式 1 ] 操作符 [ 表达式2 ]...
格式2:命令1 操作符 命令2 ...

常用的测试操作符

命令含义
-a或&&:逻辑与,‘‘而且’ 的意思
**-o或:** 逻辑或,“或者” 的意思
!: 逻辑否

• &&、|| 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错

• || 操作符 如果前面的表达式条件成立,不会去管,不成立就会输出

小数运算

(1) bc命令

echo ”4.3 -2.5“|bc #运算中你有多少个小数点,他才能显示多少个小数点

echo ”scale=2;4.3 -2.5“|bc #用除法前要加scale=数字,数字表示多少位小数

(2) awk命令

awk 'BEGIN{print 2.5+3.4}' #awk最多精确小数点最后5位

if语句的结构

image-20211020015945844.png

image-20211020020002128.png

image-20211020020018130.png

分支结构

单分支结构

单分支

if 判断条件;

then   条件为真的分支代码

fi

双分支结构

双分支

if 判断条件; then
 条件为真的分支代码

else
 条件为假的分支代码

fi

多分支结构

image.png

多分支

if 判断条件1
then
 条件1为真的分支代码

elif 判断条件2
then
 条件2为真的分支代码

elif 判断条件3;then
 条件3为真的分支代码

...
else
 以上条件都为假的分支代码

fi

三元运算符

[ 表达式 ] && a || b

#a是真,b是假

也可也直接 [ 表达式 ] && a

case语句结构

case多分支结构

image.png 格式

case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

case 变量引用 in
PAT1)
 分支1
 ;;
PAT2)
 分支2
 ;;
...
*)
 默认分支
 ;;



yes  no


YES yEs  YeS  yeS    y Y
 
No NO  nO      N n
case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[0-9] 指定范围内的任意单个字符
|   或者,如: a|b

例子:

read -p "Do you agree(yes/no)? " INPUT
INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`
转换大小写
case $INPUT in
y|yes)
      echo "You input is YES"
     ;;
n|no)
      echo "You input is NO"
     ;;
*)
      echo "Input fales,please input yes or no!"
esac

read -p "Do you agree(yes/no)? " INPUT
case $INPUT in
[yY]|[Yy][Ee][Ss])
    echo "You input is YES"
   ;;
[Nn]|[Nn][Oo])
    echo "You input is NO"
   ;;
*)
    echo "Input fales,please input yes or no!"                                   
                             
esac



#!/bin/bash
read -p "请输入你的分数" score

case $score in
100)
echo "$score 你太优秀了"
;;
[89][0-9])
echo "$score 表现不错"
;;
[67][0-9])
echo "$score 你及格了"
;;
[0-9]|[1-5][0-9])
echo "$score 你不及格"
;;
*)
echo "输入有误"
esac




#!/bin/bash
key=`echo $[RANDOM%3+1]`
read -p "请输入1包子 2剪子 3 锤子:" num

case $num in
1)
 num="包子"
;;
2)
 num="剪子"
;;
3)
 num="锤子"
;;
*)
 echo "你输错了!"
 exit
;;
esac

case $key in
1)
 key="包子"
;;
2)
 key="剪子"
;;
3)
 key="锤子"
;;
esac


if [ $num = "包子" -a $key = "锤子"  -o $num = "剪子" -a $key = "包子" -o $num = "锤子" -a $key = "剪子" ]
then

echo 机器出的是$key
echo 你出的是$num 

echo "人类胜利"
elif [ $num = $key ]
then
echo 机器出的是$key
echo 你出的是$num 

echo "打成平局再来一次"
else

echo 机器出的是$key
echo 你出的是$num 
echo "机器胜利"
fi