shell中while与for循环详解

r囧r小猫 2023-07-05 14:45 102阅读 0赞

1. while循环

while循环是shell脚本中最简单的一种循环,当条件满足时,while重复的执行一组语句,当条件不满足时,就退出while循环

Shell while循环的用法如下:

  1. while condition
  2. do
  3. statements
  4. done

condition表示判断条件,statements表示要执行的语句(可以是一条,也可以有多条),do 和 done都是shell中的关键字

注意:在while循环体中必须有相应的语句使得condition越来越趋近于“不成立”,只有这样才能最终退出循环,否则while就成了死循环,会一直执行下去,永无休止

while语句和if else语句中的condition用法都是一样的,可以使用test命令或[],也可以使用(())或者[[]]

以下是一个基本的while循环,
测试条件是:如果i小于等于100,那么条件返回真。i 从1开始,每次循环处理时,i 加1。运行上述脚本:
eg:

  1. #!/bin/bash
  2. i=1
  3. sum=0
  4. while (( i<=100 ))
  5. do
  6. ((sum+= i))
  7. ((i++))
  8. done
  9. echo "This sum is: $sum"

运行脚本,输出:

  1. The sum is: 5050

2. while循环读取键盘输入

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。

  1. #!/bin/bash
  2. echo '按下 <CTRL-D> 退出'
  3. echo -n '输入你最喜欢的网站名: '
  4. while read FILM
  5. do
  6. echo "是的!$FILM 是一个好网站"
  7. done

运行脚本,输出为:

  1. 按下 <CTRL-D> 退出
  2. 输入你最喜欢的网站名:百度
  3. 是的!百度 是一个好网站

即在终端中读取数据,可以等于在文件中读取数据,按下ctrl+d组合键表示读取到文件流的末尾,此时read就会读取失败。得到一个 非0的退出状态,从而导致判断条件不成立,结束循环

3.Shell无限循环

三种无限循环语法格式:

  1. while :
  2. do
  3. command
  4. done
  5. while true
  6. do
  7. command
  8. done
  9. for (( ; ; ))

4. for 循环

除了while循环和until循环,Shell脚本还提供了for循环,它更加灵活易用,更加简洁明了。Shell for循环有两种形式:C语言风格和Python语言风格

C语言风格for循环的用法如下:

  1. for ((exp1;exp2;exp3))
  2. do
  3. statements
  4. 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

  1. #!/bin/bash
  2. sum=0
  3. for ((i=1;i<=100;i++))
  4. do
  5. ((sum += i))
  6. done
  7. echo "the sum is: $sum"

运行结果为:

  1. the sum is: 5050

2.实例2:省略exp1

  1. #!/bin/bash
  2. sum=0
  3. i=1
  4. for ((;i<=100;i++))
  5. do
  6. ((sum += i))
  7. done
  8. echo "the sum is: $sum"

运行结果为:

  1. the sum is: 5050

3.实例3:省略exp2

若要省略exp2后还要保证脚本功能不变,可以进行如下调整:

  1. #!/bin/bash
  2. sum=0
  3. for ((i=1; ;i++))
  4. do
  5. if ((i > 100 )); then
  6. break
  7. fi
  8. ((sum += i))
  9. done
  10. echo "the sum is: $sum"

运行结果为:

  1. the sum is: 5050

4.实例4:省略exp3

若要省略exp3后还要保证脚本功能不变,可以进行如下调整:

  1. #!/bin/bash
  2. sum=0
  3. for ((i=1;i<=100;))
  4. do
  5. ((sum += i))
  6. ((i++))
  7. done
  8. echo "the sum is: $sum"

运行结果为:

  1. the sum is: 5050

5.实例5:三个条件均省略

若要省略三个条件后还要保证脚本功能不变,可以进行如下调整:

  1. #!/bin/bash
  2. sum=0
  3. for ((; ;))
  4. do
  5. if ((i > 100 )); then
  6. break
  7. fi
  8. ((sum += i))
  9. ((i++))
  10. done
  11. echo "the sum is: $sum"

运行结果为:

  1. the sum is: 5050

Python语言风格for in循环

Python语言风格for in循环用法如下:

  1. for var in value_list
  2. do
  3. statements
  4. done

其中:var表示变量,value_list表示取值列表,in是Shell中的关键字
实例一:

  1. #!/bin/bash
  2. sum=0
  3. for n in 1 2 3 4 5
  4. do
  5. echo $n
  6. ((sum+=n))
  7. done
  8. echo "the sum is: $sum"

运行结果为:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. the sum is: 15

实例2

  1. #!/bin/bash
  2. for str in "a" "b" "c"
  3. do
  4. echo $str
  5. done

运行结果为:

  1. a
  2. b
  3. c

3.实例3:in后跟取值范围

in后也可以给出一个取之范围{start…end}
其中:
start:起始值
end:终止值

注意:中间用两个点相连,这种形式只支持数字和字母

  1. #!/bin/bash
  2. sum=0
  3. for n in { 1..100}
  4. do
  5. ((sum+=n))
  6. done
  7. echo sum is: $sum
  8. for c in { A..z}
  9. do
  10. printf "%c" $c
  11. done

输出结果为:

  1. sum is: 5050
  2. ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz

实例4:in后跟命令

in后还可以跟命令,根据命令的执行结果来选择范围:

  1. #!/bin/bash
  2. sum=0
  3. #seq是一个linux命令 用来产生某个范围内的整数 并且可以设置步长
  4. for n in $(seq 2 2 100)
  5. do
  6. ((sum+=n))
  7. done
  8. echo sum is: $sum

运行结果为:

  1. sum is: 2550

实例5:in后跟通配符
in后还可以跟通配符,根据通配符的执行结果来选择范围:

  1. #!/bin/bash
  2. for i in *.sh
  3. do
  4. echo $filename
  5. done

运行结果为:

  1. 01.sh
  2. 02.sh
  3. 03.sh
  4. 04.sh
  5. 05.sh
  6. 06.sh

实例6:in后跟特殊符号

in后还可以跟特殊符号,根据特殊符号的执行结果来选择范围:

  1. #!/bin/bash
  2. # $@表示列表中的所有参数
  3. function func(){
  4. for str in $@
  5. do
  6. echo $str
  7. done
  8. }
  9. func C++ Java Python Shell

运行结果为:

  1. C++
  2. Java
  3. Python
  4. Shell

发表评论

表情:
评论列表 (有 0 条评论,102人围观)

还没有评论,来说两句吧...

相关阅读