while循环
也称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况。
(1)计数器控制的while循环(注意代码中的空格)
#!/bin/bash
sum=0
i=1
while (( i <= 100 ))
do
let "sum+=i"
let "i += 2"
done
echo "sum=$sum"
指定了循环的次数500,初始化计数器值为1,不断测试循环条件i是否小于等于100。在循环条件中设置了计数器加2来计算1~100内所有的奇数之和。
(2)结束标记控制的while循环(注意每一个空格)
设置一个特殊的数据值(结束标记)来结束while循环。
//算是找数字的游戏吧,只不过数字得自己写
#!/bin/bash
echo "Please input the num(1-10) "
read num
while [[ "$num" != 4 ]]
do
if [ "$num" -lt 4 ]
then
echo "Too small. Try again!"
read num
elif [ "$num" -gt 4 ]
then
echo "To high. Try again"
read num
else
exit 0
fi
done
echo "Congratulation, you are right! "
例:通过结束标记控制实现阶乘的操作
计算阶乘的例子
#!/bin/bash
echo "Please input the num "
read num
factorial=1
while [ "$num" -gt 0 ]
do
let "factorial= factorial*num"
let "num--"
done
echo "The factorial is $factorial"
(3)标志控制的while循环
使用用户输入的标志值来控制循环的结束(避免不知道循环结束标志的条件)。
#!/bin/bash
echo "Please input the num "
read num
sum=0
i=1
signal=0
while [[ "$signal" -ne 1 ]]
do
if [ "$i" -eq "$num" ]
then
let "signal=1"
let "sum+=i"
echo "1+2+...+$num=$sum"
else
let "sum=sum+i"
let "i++"
fi
done
标志控制的while循环求1~n的累加和,循环变量值小于100执行else累加同时循环变量加1,直到循环变量值等于100将标志值设置为1,并输出。
标志控制的while循环与结束标记控制的while循环的区别是用户无法确定无法确定结束标志,只能程序运行后确定结束标志。两者也可以相互转化。
(4)命令行控制的while循环
使用命令行来指定输出参数和参数个数,通常与shift结合使用,shift命令使位置变量下移一位($2代替$1、$3代替
#变量递减),当最后一个参数显示给用户,KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲会等于0,*也等于空。
#!/bin/bash
echo "number of arguments is $#"
echo "What you input is: "
while [[ "$*" != "" ]]
do
echo "$1"
shift
done
$num: num为从1开始的数字,$1是第一个参数,$2是第二个参数…
$*: 所有的位置参数(作为单个的字符串)
$#: 传入脚本的参数的个数
循环条件可以改写为while[[ “$#” -ne 0 ]],等于0时退出while循环
until循环
until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。
#!/bin/bash
i=0
until [[ "$i" -gt 5 ]] #大于5
do
let "square=i*i"
echo "$i * $i = $square"
let "i++"
done