shell编程快速入门七:流程控制

一、条件选择

1.选择执行if语句

格式:if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ elseCOMMANDS; ] fi

  • 多个条件时,逐个条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
  • if 语句可嵌套

示例:

#!/bin/bash
read -p "请输入身高(m为单位): " HIGH
if [[ ! "$HIGH" =~ ^[0-2].?[0-9]{,2}$ ]];then echo "输入错误的身高"; exit 1; fi
read -p "请输入体重(kg为单位): " WEIGHT
if [[ ! "$WEIGHT" =~ ^[0-9]{1,3}$ ]];then echo "输入错误的体重"; exit 1; fi
BMI=`echo $WEIGHT/$HIGH^2|bc`
if [ $BMI  -le 18 ] ;then
 echo "你太瘦了,多吃点"
elif [ $BMI  -lt 24 ] ;then
 echo "身材很棒!"
else
 echo "你太胖了,注意节食,加强运动"
fi

2.条件判断case语句

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

case支持glob风格的通配符:

*任意长度任意字符
?任意单个字符
[]指定范围内的任意单个字符
|或,如 a或b

示例:

#!/bin/bash
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

二、循环

1.for循环

格式1:

for 变量名 in 列表;do
 循环体
done

for循环列表生成方式:

  • 直接给出列表
  • 整数列表:
{start..end}
$(seq [start [step]] end)
  • 返回列表的命令:$(COMMAND)
  • 使用glob,如:*.sh
  • 变量引用,如:$@0043f

示例:

#!/bin/bash
for i in {1..9};do
 for j in `seq $i`;do
 echo -e "${j}x${i}=$[i*j]\t\c"
 done
 echo
done

格式2

双小括号方法,即((…))格式,也可以用于算术运算,双小括号方法也可以使bash Shell实现C语言风格的变量操作

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
 循环体
done

2.while循环

格式:

while CONDITION; do
 循环体
done

示例:

#!/bin/bash
WARNING=80
while :;do
   USE=`df | sed -rn '/^\/dev\/sd/s#.* ([0-9]+)%.*#\1#p' |sort -nr|head -n1`
   if [ $USE -gt $WARNING ];then
      echo Disk will be full from `hostname -I` | mail  -s "disk warning"
29308620@qq.com
   fi
   sleep 10
done

3.until循环

格式:直接条件为假,才进入循环。满足即退出

until CONDITION; do
 循环体
done

4.循环控制语句 continue

5.循环控制语句 break

6.循环控制 shift 命令

shift [n] 用于将参量列表 list 左移指定次数,缺省为左移一次。

参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift

示例:

#!/bin/bash
#step through all the positional parameters
until [ -z "$1" ] 
do
 echo "$1"
 shift
done
echo   

7.while read 特殊用法

while 循环的特殊用法,遍历文件或文本的每一行

格式:

while read line; do
 循环体
done < /PATH/FROM/SOMEFILE

说明:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

示例1:

示例2:

#!/bin/bash
while read line ;do
        if [[ "$line" =~ /sbin/nologin$ ]] ;then
                echo $line | cut -d: -f1,3
        fi                                                                       
                                
done < /etc/passwd

8.select 循环与菜单

格式:

select variable in list ;do 
 循环体命令
done

说明:

  • select 循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示 PS3 提示符,等待用户输入
  • 用户输入菜单列表中的某个数字,执行相应的命令
  • 用户输入被保存在内置变量 REPLY 中
  • select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以用ctrl+c 退出循环
  • select 经常和 case 联合使用
  • 与 for 循环类似,可以省略 in list,此时使用位置参量

示例:

#!/bin/bash
#
sum=0
PS3="请点菜(1-6): "
select MENU in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;do
case $REPLY in
1)
 echo $MENU 价格是 100
 let sum+=100
 ;;
2)
 echo $MENU 价格是 88
 let sum+=88
 ;;
3)
 echo $MENU价格是 66
 let sum+=66
 ;;
4)
 echo $MENU 价格是 166
 let sum+=166
 ;;
5)
 echo $MENU 价格是 200
 let sum+=200
 ;;
6)
 echo "点菜结束,退出"
 break
 ;;
*)
 echo "点菜错误,重新选择"
 ;;
esac
done
echo "总价格是: $sum"
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享