1-24-case流程控制和for、while循环语句的使用


时间:2018-06-17 姓名:魏文应


一、控制语句 case

语法格式:

case 变量值 in
  模式1)
    执行相应命令,遇到两个分号,退出(两个分号相当于break)
    ;;
  模式2)
     执行相应命令,遇到两个分号,退出(两个分号相当于break)
    ;;
  *)
    缺省,则执行这里的命令。
esac

上面语法中:

  • 变量值后面必须为in。
  • 每一个匹配模式,以英文右括号结束 )。
  • 匹配到模式后,遇到 ;; 结束case语句。
  • esac 表示case语句结束。

比如下面的例子:

#!/bin/bash
clear

echo "*********************"
echo "  1 copy             "
echo "  2 delete           "
echo "  3 backup           "
echo "  4 quit             "

read -p "请输入你的选择:" op
case $op in
        1) echo "your selection is copy."
        ;;
        2) echo "your selection is delete."
        ;;
        3) echo "your selection is backup."
        ;;
        4) echo "your selection is quit."
        ;;
        *) echo "invaild selection"
esac

二、for 循环语句

语法格式:

for 变量 in 名字表
do
命令列表
done

举一个例子:

#!/bin/bash

# 将所需要的变量列举出来
day="sunday monday tuesday wendnesday thursday friday saturday"

# 将day内容依次打印出来。
for x in $day
do
        echo "the day is:$x "
done

再比如:

#!/bin/bash

for i in `seq 9`
do
        echo "num is $i"
done

比如批量创建用户:

#!/bin/bash
ULIST=$(cat ./name.txt)

for UNAME in $ULIST
do
        useradd $UNAME
        echo "123456" | passwd --stdin $UNAME &> /dev/null
done

三、while循环语句

语法格式:

while 条件
do
  命令
done

比如,计算打印1~9的平方:

#!/bin/bash

num=1
while [ $num -lt 10 ]
do
        square=$(expr $num \* $num)
        echo $square
        let num++
done

四、无限循环

可以使用while或者for进行无限循环,有多种方式,比如:

while :
do
  命令
done

或者:

for (( ; ; ))

或者:

while true
do
   命令
done

五、扩展算数运算的方法

使用 (( )) 两个括号的时候,可以扩展shell中的算数运算的使用方法。特点:

  • 在两个括号中,运算可以像C语言一样,比如:a++、b--、a=a+1等表达式是可用的。
  • 括号内使用变量,可以不使用 $ 符号前缀。
  • 可以进行 逻辑运算、四则运算。
  • 双括号结构,扩展了 for、while、if 条件测试运算。
  • 支持多个表达式运算,各个表达式之间用 分号分开。
echo "这是一个循环例子。"
echo
var1=1
while((var1<100))
do
        echo "它的有效值是:$var1"
        ((var1=var1*2))
done

echo "测试完成"

六、嵌套循环

read -p "请输入你要打印的行数:" line
read -p "请输入你要使用的符号:" char

a=1
while [ $a -le $line ]
do
        b=1
        while [ $b -le $a ]
        do
                echo -n "$char"
                b=`expr $b + 1`
        done
        echo
        a=`expr $a + 1`
done

使用for

#!/bin/bash

read -p "please enter a number :" line

for((i=1;i<=line;i++))
do
        for((j=line-i;j>0;j--))
        do
                echo -n " "
        done
        for((h=1;h<=((2*i-1));h++))
        do
                echo -n "*"
        done
        echo
done

七、跳出循环 break 和 continue 继续

使用 break 跳出循环,使用 continue 继续循环。比如下面的代码:

  • 执行break,while循环就从 break处,跳出当前循环,执行 done后面 的语句。
  • 执行continue,while循环就从 continue处,回到 while 处 继续执行。
#!bin/bash

while true
do
        echo "** 输入1,执行break    **"
        echo "** 输入2,执行continue **"
        echo "** 输入其它,继续循环     **"        

        read -p "请输入对应的数字:" num
        case $num in
                1)      echo "执行了break"
                        break
                ;;
                2)      echo  "执行了continue"
                        continue
                ;;
                *)
                ;;
        esac
        
        echo "没有continue的效果。"
done

echo " while循环结束了,执行了break,程序就跑到这运行了。"

下面是嵌套循环加上continue和break 测试:

#!/bin/bash

while true
do
        echo 
        echo "**************************"
        echo "**** 1   copy         ****"
        echo "**** 2   delete       ****"
        echo "**** 3   backup       ****"
        echo "**** 4   no continue  ****"
        echo "**** q   quit         ****"
        echo "**************************"
        read -p "please input options: " sum
        case $sum in
                1)      echo "You choice is copy"
                        read -p "from file:" wen1
                        read -p "to file:" wen2
                        if [ -f $wen1 -a -d $wen2 ];then
                                cp $wen1 $wen2
                                ls $wen2
                                echo "copy file success"
                        elif [ -d $wen1 -a -d $wen2 ];then
                                cp -r $wen1 $wen2
                               ls $wen2
                                echo "copy directory success"
                        else
                                echo "Do not change the directory or file"
                                continue
                        fi
                ;;
                2)      echo "you choice is delete"
                        read -p "from file" wen1
                        if [ -f $wen1 ]; then
                                rm -f $wen1
                                ls $wen1
                                echo "delete file success"
                        elif [ -d $wen1 ];then
                                rm -rf $wen1
                                ls $wen1
                                echo "delete directory success"
                        else
                                echo "Do not change the directory or file"
                                continue
                        fi
                ;;
               3)      echo "you choice is bakcup"
                        read -p "from file :" wen1
                        read -p "to file :" wen2
                        cd $wen2 2 > /dev/null
                        if [ -d $wen2 -o -f $wen1 ];then
                                tar -jcvf $wen1.tar.bz2 $wen1
                        else
                                echo "input error"
                                continue
                        fi
                ;;
                4)      echo "test continue"
                ;;
                q)      echo "you choice is to quit"
                        break
                ;;
                *)      echo "please input again "
                        continue
                ;;
        esac
        echo "no continue"
done
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容