回圈 (loop)--while do done, until do done (不定回圈)

本文深入探讨了Bash脚本中回圈与条件判断的使用,详细解释了不定回圈和固定回圈的区别,并通过实例演示如何解决实际问题,如输入验证和累加求和。

除了 if...then...fi 这种条件判断式之外,回圈可能是程序当中最重要的一环了~回圈可以不断的运行某个程序段落,直到使用者配置的条件达成为止。 所以,重点是那个『条件的达成』是什么。除了这种依据判断式达成与否的不定回圈之外, 还有另外一种已经固定要跑多少次的回圈形态,可称为固定回圈的形态呢!底下我们就来谈一谈:

while do done, until do done (不定回圈)

一般来说,不定回圈最常见的就是底下这两种状态了:

1.当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止:

while [condition] -->中括号内的状态就是判断式

do -->回圈的开始

程序段落

done -->回圈的结束

2.当 condition 条件成立时,就终止回圈,否则就持续进行回圈的程序段:

until [condition]

do

程序段

done

实例一:

#!/bin/bash
#Repeat question until input correct answer.

while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program:" yn
done
echo "Oh,you input the correct answer!"

实例二:

#!/bin/bash
#Repeat question until user input the correct answer!
until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program:" yn
done
echo "oh,you input the correct answer!"

比较一下有什么不同\(^o^)/~

如果我想要计算 1+2+3+....+100 这个数据呢? 利用回圈啊

#!/bin/bash
#The program will use loop to calculate "1+2+3..+100"

i=0
sum=0
while [ "$i" != "100" ]
do
i=$(($i+1))
sum=$(($sum+$i))
done
echo "The result of "1+2+3..+100" is ==> $sum"

或者用until

#!/bin/bash
#The program will use loop to calculate "1+2+3+...+100"

i=0
sum=0
until [ "$i" == "100" ]
do
i=$(($i+1))
sum=$(($sum+$i))
done
echo "The result of '1+2+3+...+100' is ==> $sum."

执行结果都是:

The result of 1+2+3..+100 is ==> 5050

O(∩_∩)O~,很好玩吧!

本关任务:掌握 shell 语句中的循环嵌套的方法和使用场景,输出系统中的可执行文件。 相关知识 循环语句可以在循环内使用任意类型的命令,包括其他循环命令。这种循环叫作嵌套循环(nested loop)。注意,在使用嵌套循环时,你是在迭代中使用迭代,与命令运行的次数是乘积关系。不注意这点的话,有可能会在脚本中造成问题。 for-for循环嵌套 这里有个在 for 循环中嵌套 for 循环的简单例子。 【实例1】 #!/bin/bash # nesting for loops for (( a = 1; a <= 3; a++ )) do echo "Starting loop $a:" for (( b = 1; b <= 3; b++ )) do echo " Inside loop: $b" done done 执行脚本输出结果为: Starting loop 1: Inside loop: 1 Inside loop: 2 Inside loop: 3 Starting loop 2: Inside loop: 1 Inside loop: 2 Inside loop: 3 Starting loop 3: Inside loop: 1 Inside loop: 2 Inside loop: 3 这个被嵌套的循环(也称为内部循环,inner loop)会在外部循环的每次迭代中遍历一次它所有的值。注意,两个循环的 dodone 命令没有任何差别。bash shell 知道当第一个 done 命令执行时,是指内部循环而非外部循环。 for-while循环嵌套 在混用循环命令时也一样,比如在 while 循环内部放置一个 for 循环。 【实例2】 #!/bin/bash # placing a for loop inside a while loop var1=5 while [ $var1 -ge 0 ] do echo "Outer loop: $var1" for (( var2 = 1; $var2 < 3; var2++ )) do var3=$[ $var1 * $var2 ] echo " Inner loop: $var1 * $var2 = $var3" done var1=$[ $var1 - 1 ] done 执行脚本输出结果为: Outer loop: 5 Inner loop: 5 * 1 = 5 Inner loop: 5 * 2 = 10 Outer loop: 4 Inner loop: 4 * 1 = 4 Inner loop: 4 * 2 = 8 Outer loop: 3 Inner loop: 3 * 1 = 3 Inner loop: 3 * 2 = 6 Outer loop: 2 Inner loop: 2 * 1 = 2 Inner loop: 2 * 2 = 4 Outer loop: 1 Inner loop: 1 * 1 = 1 Inner loop: 1 * 2 = 2 Outer loop: 0 Inner loop: 0 * 1 = 0 Inner loop: 0 * 2 = 0 until-while循环嵌套 如果真的想挑战脑力,可以混用 untilwhile 循环。 【实列3】 #!/bin/bash # using until and while loops var1=3 until [ $var1 -eq 0 ] do echo "Outer loop: $var1" var2=1 while [ $var2 -lt 5 ] do var3=$(echo "scale=4; $var1 / $var2" | bc) echo " Inner loop: $var1 / $var2 = $var3" var2=$[ $var2 + 1 ] done var1=$[ $var1 - 1 ] done 执行脚本输出结果为: Outer loop: 3 Inner loop: 3 / 1 = 3.0000 Inner loop: 3 / 2 = 1.5000 Inner loop: 3 / 3 = 1.0000 In
10-14
#!/bin/bash # # . /etc/profile.d/ma_specific.sh [ -n "$2" ] && BOOTSERVER=$2 [ -n "$3" ] && DEVMOUNTS=$3 [ -n "$4" ] && MOUNTTO=$4 [ -n "$5" ] && LOGLVL=$5 X=$(get_bootparam bootserver) && BOOTSERVER=$X X=$(get_bootparam devmounts) && DEVMOUNTS=$X X=$(get_bootparam mountto) && MOUNTTO=$X X=$(get_bootparam loglvl) && LOGLVL=$X #[ -z $BOOTSERVER ] && BOOTSERVER=192.168.0.126 #[ -z $DEVMOUNTS ] && DEVMOUNTS=/tftpboot/data/ma/actual/gma2/bin/ echo "BOOTSERVER=$BOOTSERVER DEVMOUNTS=$DEVMOUNTS MOUNTTO=$MOUNTTO LOGLVL=$LOGLVL" mountcheck() { search=$1 x=$(mount | awk '$1=="'$search'" { print $1}') test -n "$x" } domount() { local status=0 echo -n "Mounting $1: " if mountcheck $1 then echo "Mountpoint always mounted. Operation skipped." let status=1 else mkdir $2 -p let status=status+$? mount $1 $2 -o nolock,tcp >/dev/null let status=status+$? fi test "$status" -eq 0 check_status } dounmount() { local status=0 echo -n "Unmounting $1: " if mountcheck $1 then umount $1 -l 1>/dev/null 2>&1 let status=status+$? else echo "Mountpoint not mounted. Operation skipped." status=1 fi test "$status" -eq 0 check_status } domountdev() { for i in $(echo $DEVMOUNTS | tr ";" "\n") do if [ -z $MOUNTTO ] then #TO="/media/$DEVMOUNTS" #TO=$(echo $i|sed 's/\/tftpboot//') TO=$i else TO=$MOUNTTO fi domount $BOOTSERVER:/$i $TO done } mount_all() { local SEARCH=$1 local FROM= local TO= for FROM in $(showmount -e $BOOTSERVER | grep "$SEARCH" | cut -f1 -d\ ) do TO=$(echo $FROM|sed 's/\/tftpboot//') domount $BOOTSERVER:/$FROM $TO done } unmount_all() { local SEARCH=$1 local FROM= local TO= cd / for FROM in $(showmount -e $BOOTSERVER | grep "$SEARCH" | cut -f1 -d\ ) do TO=$(echo $FROM|sed 's/\/tftpboot//') dounmount $BOOTSERVER:/$FROM $TO done } check_all() { local SEARCH=$1 local FROM= local TO= for FROM in $(showmount -e $BOOTSERVER | grep "$SEARCH" | cut -f1 -d\ ) do TO=$(echo $FROM|sed 's/\/tftpboot//') echo -n "$TO" mountcheck $BOOTSERVER:/$FROM check_status done } function wait_for_server_ready { echo -n "Waiting for mountserver $BOOTSERVER" LOOP=10 #10 sec wait while [ $LOOP -ne 0 ] do ping -c 1 $BOOTSERVER > /dev/null if [ "$?" == "0" ] then LOOP=0 else echo -n "." let LOOP-- sleep 1 fi done echo " " } SEARCH_PATTERN="/data/ma/actual/gma" [ -z $BOOTSERVER ] && exit 0 case "$1" in start) wait_for_server_ready domountdev [ -z "$LOGLVL" ] || service logging restart_with_netlog -L -R $BOOTSERVER -l $LOGLVL ;; stop) umount -alt nfs #without -a only last mountpoint ;; restart) $0 stop $0 start ;; status) mount | grep nfs ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac
最新发布
11-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值