Shell流程控制
流程控制无论在什么编程语言中都是非常重要的一部分,掌握编程语言的流程控制语句可以为我们编写代码减轻极大的负担!接下来,我们一起看看Shell脚本中的流程控制语法!
为什么我们要掌握流程控制的语法?
当我们做一些判断的时候,对于简单的我们可以使用三目运算符来满足我们的需求,如:
x = 6
y = 2
z = x>y ? x-y : x+y;
可当我们需要进行一些更加复杂的判断时三目运算符就显得力不从心了,因此我们掌握流程控制语法就显得非常关键了。尤其是我们需要重复进行一些具有相同特征的计算(打印九九乘法表、计算1-100的和)等,这时循环就为我们减轻了非常大的麻烦!
一、if判断语句
-
基本语法
if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格 -
案例操作
(1)测试:输入一个数字,如果是y,则输出I am true,如果是n,则输出I am false,如果是其它,什么也不输出。[root@bigdata01 centos-shell]# vi if.sh
#! /bin/bash #下面编写if判断语句的使用方法 if [ $1=='y' ] then echo "i am true" elif [ $1 == 'n' ] then echo "i am false" fi
执行结果:
[root@bigdata01 centos-shell]# chmod 777 if.sh [root@bigdata01 centos-shell]# ./if.sh y i am true [root@bigdata01 centos-shell]# ./if.sh n i am true
(2)测试:输入一个成绩,[100,80]输出优异,(80,60],输出及格,雄小于60,输出你需要补考。输入数据不在1-100范围,输出“你的输入有误;请重新输入0-100之间的整数”
[root@bigdata01 centos-shell]# vi if.sh
#! /bin/bash echo -n "请输入您的分数(0-100整数):" read num if (( $num<=100&&$num>=80 )) then echo "成绩优异" ; elif (( $num<80&&$num>60 )) then echo "成绩合格" ; elif (( $num==60 )) then echo "及格万岁" ; elif (( $num<60&&$num>=0 )) then echo "你需要补考" else echo "你的输入有误;请重新输入0-100之间的整数" fi
执行结果:
[root@bigdata01 centos-shell]# ./if.sh 请输入您的分数(0-100整数):100 成绩优异 [root@bigdata01 centos-shell]# ./if.sh 请输入您的分数(0-100整数):68 成绩合格 [root@bigdata01 centos-shell]# ./if.sh 请输入您的分数(0-100整数):56 你需要补考 [root@bigdata01 centos-shell]# ./if.sh 请输入您的分数(0-100整数):123 你的输入有误;请重新输入0-100之间的整数
2、case 语句
-
基本语法
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
注意事项:
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。 2)双分号“;;”表示命令序列结束,相当于java中的break。 3)最后的“*)”表示默认模式,相当于java中的default。
-
案例实操
(1)输入一个数字,如果是1,则输出“今天天气真不错”,如果是2,则输出“蚂蚁搬家”,如果是其它,输出“今天没啥”。#! /bin/bash case $1 in "1"){ echo "今天天气真不错" };; "2"){ echo "蚂蚁搬家" };; *){ echo "今天没啥" };; esac
执行结果:
[root@bigdata01 centos-shell]# ./case.sh 今天没啥 [root@bigdata01 centos-shell]# ./case.sh 1 今天天气真不错 [root@bigdata01 centos-shell]# ./case.sh 2 蚂蚁搬家
3、for 循环
-
基本语法1
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
-
案例实操
(1)从1加到100[root@bigdata01 centos-shell]# cat for2.sh #! /bin/bash sum=0 for ((i=1;i<=100;i++)) do sum=$[$sum+$i] done echo $sum
执行结果:
[root@bigdata01 centos-shell]# ./for2.sh 5050
(2)打印九九乘法表
#! /bin/bash for (( i=1;i<=9;i++ )) do for (( j=1;j<=9;j++ )) do [ $j -le $i ] && echo -n "${i} * ${j}=$((i*j)) " done echo "" done
执行结果
[root@bigdata01 centos-shell]# ./for.sh 1 * 1=1 2 * 1=2 2 * 2=4 3 * 1=3 3 * 2=6 3 * 3=9 4 * 1=4 4 * 2=8 4 * 3=12 4 * 4=16 5 * 1=5 5 * 2=10 5 * 3=15 5 * 4=20 5 * 5=25 6 * 1=6 6 * 2=12 6 * 3=18 6 * 4=24 6 * 5=30 6 * 6=36 7 * 1=7 7 * 2=14 7 * 3=21 7 * 4=28 7 * 5=35 7 * 6=42 7 * 7=49 8 * 1=8 8 * 2=16 8 * 3=24 8 * 4=32 8 * 5=40 8 * 6=48 8 * 7=56 8 * 8=64 9 * 1=9 9 * 2=18 9 * 3=27 9 * 4=36 9 * 5=45 9 * 6=54 9 * 7=63 9 * 8=72 9 * 9=81
-
基本语法2
for 变量 in 值1 值2 值3… do 程序 done
案例实操
(1)打印所有输入参数[root@bigdata01 centos-shell]# cat for3.sh #! /bin/bash for i in $* do echo $i done
执行结果:
[root@bigdata01 centos-shell]# ./for3.sh 1 2 3 4 5 6 1 2 3 4 5 6
(2)比较 ∗ 和 *和 ∗和@区别
(a) ∗ 和 *和 ∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1[root@bigdata01 centos-shell]# cat for4.sh #! /bin/bash for i in $* do echo "I Love $i" done for j in $@ do echo "I Love $j" done
执行结果:
[root@bigdata01 centos-shell]# ./for4.sh Guizhou Yunnan Anhui Beijing I Love Guizhou I Love Yunnan I Love Anhui I Love Beijing I Love Guizhou I Love Yunnan I Love Anhui I Love Beijing
(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2”…”n”的形式输出所有参数。
[root@bigdata01 centos-shell]# cat for4.sh #! /bin/bash for i in "$*" do echo "I Love $i" done for j in "$@" do echo "I Love $j" done
执行结果:
[root@bigdata01 centos-shell]# ./for4.sh Guizhou Yunnan Anhui Beijing I Love Guizhou Yunnan Anhui Beijing I Love Guizhou I Love Yunnan I Love Anhui I Love Beijing
while 循环
- 基本语法
while [ 条件判断式 ] do 程序 done
- 案例实操
(1)从1加到100
执行结果:[root@bigdata01 centos-shell]# cat while.sh #! /bin/bash i=1 sum=0 while [ $i -le 100 ] do sum=$[$sum+$i] i=$[$i+1] done echo $sum
[root@bigdata01 centos-shell]# ./while.sh 5050