for循环
列表for循环
for variable in {list}
do
command
command
…
done
do和done之间的命令称为循环体
执行次数和list列表中常数或字符串的个数相同
当执行for循环时,首先将in后的list列表的第一个常数或字符串赋值给循环变量,然后执行循环体;接着将list列表中的第二个常数或字符串赋值给循环变量,再次执行循环体,这个过程将一直持续到list列表中无其他的常数或字符串,然后执行done命令后的命令序列。
#!/bin/bash
for varible1 in 1 2 3 4 5
do
echo "Hello, Welcome $varible1 times "
done
#!/bin/bash
for file in $( ls )
do
echo "file: $file"
done
不带列表for循环
不带列表的for循环执行时由用户指定参数和参数的个数
for variable
do
command
command
…
done
其中do和done之间的命令称为循环体,Shell会自动的将命令行键入的所有参数依次组织成列表,每次将一个命令行键入的参数显示给用户,直至所有的命令行中的参数都显示给用户
#!/bin/bash
echo "number of arguments is $#"
echo "What you input is: "
for argument
do
echo "$argument"
done
运行 ./for_test.sh 1 2 3
类C风格的for循环
类C风格的for循环也可被称为计次循环,一般用于循环次数已知的情况
for(( expr1; expr2; expr3 ))
do
command
command
…
done
其中表达式expr1为循环变量赋初值的语句
表达式expr2决定是否进行循环的表达式,
当判断expr2退出状态为0执行do和done之间的循环体,
当退出状态为非0时将退出for循环执行done后的命令
表达式expr3用于改变循环变量的语句
类C风格的for循环结构中,循环体也是一个块语句,要么是单条命令,要么是多条命令,但必须包裹在do和done之间。
#!/bin/bash
for(( integer = 1; integer <= 5; integer++ ))
do
echo "$integer"
done
#!/bin/bash
sum=0
for(( i = 1; i <= 100; i = i + 2 ))
do
let "sum += i"
done
echo "sum=$sum"
let 执行运算
#!/bin/bash
sum=0
for i in {1..100..2}
do
let "sum+=i"
done
echo "sum=$sum"
等价于for(( i=1;i<=100;i+=2 ))
#!/bin/bash
sum=0
for i in $(seq 1 2 100)
do
let "sum+=i"
done
echo "sum=$sum"
[root@ktz CH08]# seq 1 10
1
2
3
4
5
6
7
8
9
10
$(seq 1 2 100)
等同于 `seq 1 2 100`
#!/bin/bash
LIMIT=5
for(( a=1, b=5; a <= LIMIT; a++, b-- ))
do
let "temp=a-b"
echo "$a-$b=$temp"
done
while循环
while循环语句也称前测试循环语句,
它的循环重复执行次数,是利用一个条件来控制是否继续重复执行这个语句。
while语句与for循环语句相比,无论是语法还是执行的流程,都比较简明易懂
while expression
do
command
command
…
done
while循环语句之所以命名为前测试循环,是因为它要先判断此循环的条件是否成立,然后才作重复执行的操作。
while循环语句执行过程是:
先判断expression的退出状态,如果退出状态为0,则执行循环体,并且在执行完循环体后,进行下一次循环,
否则退出循环执行done后的命令。
为了避免死循环,必须保证在循环体中包含循环出口条件,即存在expression的退出状态为非0的情况
计数器控制的while循环
假定该种情形是在已经准确知道要输入的数据或字符串的数目,在这种情况下可采用计数器控制的while循环结构来处理。
counter = 1
while expression
do
command
…
let command to operate counter
command
…
Done
#!/bin/bash
int=1
while(( "$int" <= 5 ))
do
echo "$int"
let "int++"
done
#!/bin/bash
sum=0
i=1
while(( i <= 100 ))
do
let "sum+=i"
let "i += 2"
done
echo "sum=$sum"
结束标记控制的while循环
在Linux Shell编程中很多时候不知道读入数据的个数,但是可以设置一个特殊的数据值来结束while循环,该特殊数据值称为结束标记,其通过提示用户输入特殊字符或数字来操作。当用户输入该标记后结束while循环,执行done后的命令。
read variable
while [[ "$variable" != sentinel ]]
do
read variable
done
标志控制的while循环
标志控制的while循环使用用户输入的标志的值来控制循环的结束,这样避免了用户不知到循环结束标记的麻烦
signal=0
while (( signal != 1 ))
do
…
if expression
then
signal=1
fi
…
done
命令行控制的while循环
有时需要使用命令行来指定输出参数和参数个数,这时用其他的三种形式的while循环是无法实现的,所以需要使用命令行控制的while循环。该形式下,while循环通常与shift结合起来使用。
shift命令
使位置变量下移一位(即$2代替$1,$3代替$2),
并且使$#变量递减,当最后一个参数也显示给用户后,$#就会等于0,同时$*也等于空
while [[ "$*" != "" ]]
do
echo "$1"
shift
done
until循环
在执行while循环时,只要是expression的退出状态为0将一直执行循环体。
until命令和while命令类似,但区别是until循环中expression的退出状态不为0将循环体一直执行下去,直到退出状态为0
until expression
do
command
command
…
done
#until_exam1.sh
#!/bin/bash
i=0
until [[ "$i" -gt 5 ]]
do
let "square=i*i"
echo "$i * $i = $square"
let "i++"
done
嵌套循环
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。在外部循环的每次执行过程中都会触发内部循环,直至内部完成一次循环,才接着执行下一次的外部循环。for循环、while循环和until循环可以相互嵌套。
break循环控制符
break语句可以应用在for、while和until循环语句中,用于强行退出循环,也就是忽略循环体中任何其他语句和循环条件的限制。
continue循环控制符
continue循环控制符应用在for、while和until语句中,用于让脚本跳过其后面的语句,执行下一次循环。
select结构
select是bash的扩展结构,用于交互式菜单显示,用于从一组不同的值中进行选择,功能有点类似于case结构,但其交互性要比case好的多,其基本结构为:
select variable in {list}
do
command
…
break
done
#select_exam1.sh
#!/bin/bash
echo "What is your favourite color? "
select color in "red" "blue" "green" "white" "black"
do
break
done
echo "You have selected $color"
执行结果
[root@ktz CH08]# ./select_exam1.sh
What is your favourite color?
1) red
2) blue
3) green
4) white
5) black
#? 1
You have selected red
[root@ktz CH08]#