1.9. 条件控制
1.9.1. if条件语句-单分支
if-else语句,是非常简单,也是非常基础的条件语句。在Java中我们已经非常熟悉它的逻辑了,在这里,我们重点关注在Shell中的语法
if [ 条件判断 ]
then
条件成立的执行逻辑
fi
或者
if [ 条件判断 ] ; then
条件成立的执行逻辑
fi
案例:
#!/bin/bash
A=$1
if [ $A == "stop" ]
then
systemctl stop firewalld
fi
注意事项:
- if语句需要使用fi结尾,和一般语言使用大括号结尾不同。
- [ 条件判断 ] 就是使用test命令判断,所以中括号和条件判断之间必须有空格
- then后面跟符合条件之后执行的程序,可以放在[]之后,用;分隔,也可以换行写入,就不需要;了
- if与中括号之间必须要有空格
1.9.2. if条件语句-多分支
if [ 条件判断式1]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件
else
当所有条件都不成立时,最后执行此程序
fi
案例1:
#!/bin/bash
read -p "please input your name:" NAME
echo $NAME
if [ $NAME == root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME == tom ]
then
echo "hello ${NAME}, welcome !"
else
echo "oh, get out here !"
fi
案例2:
编写一个坐车脚本,要求:
脚本名字: home.sh
逻辑: 从外面传入一个参数,根据参数判断: 1. 坐飞机,2. 坐火车,3. 坐火箭,4. 不回了
#!/bin/bash
CHOICE=$1
if [ $CHOICE == 1 ]
then
echo "坐飞机"
elif [ $CHOICE == 2 ]
then
echo "坐火车"
elif [ $CHOICE == 3 ]
then
echo "坐火箭"
elif [ $CHOICE == 4 ]
then
echo "不回了"
else
echo "输入的参数有问题啊"
fi
1.9.3. case
# 在Java中,我们学习过switch-case结构。这种结构,我们可以捕获一个变量的值,对这个变量取到的某些值进行不同的处理。在Shell中,也有类似的结构,就是case。
# case命令是一个多分支的if/else命令,case变量的值用来匹配value1、value2、value3等不同的值。
# 匹配到后,则执行跟在后面的命令,直到遇到双分号为止。
# 类似于if命令,case命令使用esac作为终止符。
# case行尾必须为单词in。
# 每个分支必须以右括号结束。
# 匹配模式中可使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。
# 最后的“\*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后的命令序列。
# case的格式
CMD=$1
case $CMD in # case行尾必须为 变量 in,表示捕获这个变量的值
start) # 需要匹配到的值,需要以右括号作为结尾
echo "starting" # 匹配到之后,执行的逻辑语句,即一个分支
;; # 一个分支的逻辑,需要以;;作为结束,不会向下穿透
stop)
echo "stopping"
;;
*) # *表示以上分支都不满足的情况,类似于switch-case中的default
echo "please using start|stop"
;;
esac # case语句,需要以esac结束
1.10. 循环
1.10.1. for循环
for循环命令用来在一个列表条目中执行有限次数的命令。
比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。
for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。
第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;
第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量
依次类推,直到字符串列表遍历完。
方式一:
for N in 1 2 3
do
echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done
或
for N in {1,2,3}; do echo $N; done
注意事项: {}中的数字之间不能有空格
方式二:
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
练习: 计算从1到100的和
#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
SUM=$(($SUM + $i))
done
echo $SUM
1.10.2. while循环
while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得到返回值为非0时,则终止while循环。
-
第一种:
while [ expression ] do command done
# 练习: 求1-10各个数字的平方和 #!/bin/bash num=1 while [ $num -le 10 ] do sum=`expr $num \* $num` echo $sum num=`expr $num + 1` done num=1 while [ $num -le 10 ] do sum=$(( $num * $num )) echo $sum num=$(( $num + 1 )) done
-
第二种:
while (( expression )) do command … done
# 练习: 求1-10各个数字的平方和 #!/bin/bash i=1 while (( i<= 10 )) do sum=$(( $i * $i )) echo $sum i=$(( $i + 1 )) done