shell中while与for循环详解
1. while循环
while循环是shell脚本中最简单的一种循环,当条件满足时,while重复的执行一组语句,当条件不满足时,就退出while循环
Shell while循环的用法如下:
while condition
do
statements
done
condition表示判断条件,statements表示要执行的语句(可以是一条,也可以有多条),do 和 done都是shell中的关键字
注意:在while循环体中必须有相应的语句使得condition越来越趋近于“不成立”,只有这样才能最终退出循环,否则while就成了死循环,会一直执行下去,永无休止
while语句和if else语句中的condition用法都是一样的,可以使用test命令或[],也可以使用(())或者[[]]
以下是一个基本的while循环,
测试条件是:如果i小于等于100,那么条件返回真。i 从1开始,每次循环处理时,i 加1。运行上述脚本:
eg:
#!/bin/bash
i=1
sum=0
while (( i<=100 ))
do
((sum+= i))
((i++))
done
echo "This sum is: $sum"
运行脚本,输出:
The sum is: 5050
2. while循环读取键盘输入
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。
#!/bin/bash
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
运行脚本,输出为:
按下 <CTRL-D> 退出
输入你最喜欢的网站名:百度
是的!百度 是一个好网站
即在终端中读取数据,可以等于在文件中读取数据,按下ctrl+d组合键表示读取到文件流的末尾,此时read就会读取失败。得到一个 非0的退出状态,从而导致判断条件不成立,结束循环
3.Shell无限循环
三种无限循环语法格式:
while :
do
command
done
while true
do
command
done
for (( ; ; ))
4. for 循环
除了while循环和until循环,Shell脚本还提供了for循环,它更加灵活易用,更加简洁明了。Shell for循环有两种形式:C语言风格和Python语言风格
C语言风格for循环的用法如下:
for ((exp1;exp2;exp3))
do
statements
done
这个循环语句的执行顺序是:
1.先执行exp1
2.在执行exp2,若果它的判断结果是成立的,则执行循环体中的语句,否则结束整个for循环
3.执行完循环体再执行exp3
重复2,3,直到exp2的判断结果不成立,就结束循环
其中需要注意的是:
exp1、exp2、exp3是三个表达式,其中exp2是判断条件,for循环根据exp2的结果来决定是否继续下一次循环;
statements是循环体语句,可以有一条,也可以有多条;
do 和 done是Shell的关键字
exp1仅在第一次循环时执行,以后不会再执行,可以认为这是一个初始化语句
exp2一般是一个关系表达式,决定了是够还要继续下次循环,成为“循环条件”。
exp3很多情况下是一个带有自增或者自减运算的表达式,以使循环条件逐渐变得“不成立”。
for循环中exp1(初始化语句)、exp2(判断条件)和exp3(自增或自减)都是可选项,都可以省略(但分号;必须保留)
eg:实例1
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
((sum += i))
done
echo "the sum is: $sum"
运行结果为:
the sum is: 5050
2.实例2:省略exp1
#!/bin/bash
sum=0
i=1
for ((;i<=100;i++))
do
((sum += i))
done
echo "the sum is: $sum"
运行结果为:
the sum is: 5050
3.实例3:省略exp2
若要省略exp2后还要保证脚本功能不变,可以进行如下调整:
#!/bin/bash
sum=0
for ((i=1; ;i++))
do
if ((i > 100 )); then
break
fi
((sum += i))
done
echo "the sum is: $sum"
运行结果为:
the sum is: 5050
4.实例4:省略exp3
若要省略exp3后还要保证脚本功能不变,可以进行如下调整:
#!/bin/bash
sum=0
for ((i=1;i<=100;))
do
((sum += i))
((i++))
done
echo "the sum is: $sum"
运行结果为:
the sum is: 5050
5.实例5:三个条件均省略
若要省略三个条件后还要保证脚本功能不变,可以进行如下调整:
#!/bin/bash
sum=0
for ((; ;))
do
if ((i > 100 )); then
break
fi
((sum += i))
((i++))
done
echo "the sum is: $sum"
运行结果为:
the sum is: 5050
Python语言风格for in循环
Python语言风格for in循环用法如下:
for var in value_list
do
statements
done
其中:var表示变量,value_list表示取值列表,in是Shell中的关键字
实例一:
#!/bin/bash
sum=0
for n in 1 2 3 4 5
do
echo $n
((sum+=n))
done
echo "the sum is: $sum"
运行结果为:
1
2
3
4
5
the sum is: 15
实例2
#!/bin/bash
for str in "a" "b" "c"
do
echo $str
done
运行结果为:
a
b
c
3.实例3:in后跟取值范围
in后也可以给出一个取之范围{start…end}
其中:
start:起始值
end:终止值
注意:中间用两个点相连,这种形式只支持数字和字母
#!/bin/bash
sum=0
for n in { 1..100}
do
((sum+=n))
done
echo sum is: $sum
for c in { A..z}
do
printf "%c" $c
done
输出结果为:
sum is: 5050
ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz
实例4:in后跟命令
in后还可以跟命令,根据命令的执行结果来选择范围:
#!/bin/bash
sum=0
#seq是一个linux命令 用来产生某个范围内的整数 并且可以设置步长
for n in $(seq 2 2 100)
do
((sum+=n))
done
echo sum is: $sum
运行结果为:
sum is: 2550
实例5:in后跟通配符
in后还可以跟通配符,根据通配符的执行结果来选择范围:
#!/bin/bash
for i in *.sh
do
echo $filename
done
运行结果为:
01.sh
02.sh
03.sh
04.sh
05.sh
06.sh
实例6:in后跟特殊符号
in后还可以跟特殊符号,根据特殊符号的执行结果来选择范围:
#!/bin/bash
# $@表示列表中的所有参数
function func(){
for str in $@
do
echo $str
done
}
func C++ Java Python Shell
运行结果为:
C++
Java
Python
Shell
还没有评论,来说两句吧...