Shell 流程控制-循环

Shell 脚本中的循环有三种方式, for, while, until. 其中until 和 while 表示的含义正好相反, while 标识当判断表达式为真时, 则执行循环语句, until 一直循环到判断表达式为真, 即当判断表达式为假时执行.这三种循环可以相互转化的, 所以熟练掌握一种即可. 笔者平时使用for 和 while 居多, 很少使用until.

1. for 循环

1.1 语法

#语法一  
for 控制变量 in 值1 值2 值3..  
   do  
     程序块儿  
   done  

#语法二
for 控制变量 in (起始值..终止值)
  do
    程序块儿
  done


#语法三  
for 控制变量 `命令`  
   do  
     程序块儿  
   done  


#语法四  
for ((初始值; 循环控制; 变量变化))  
  do  
    程序块儿  
  done

1.2 示例程序

#!/bin/bash

echo "[语法一] 输出五次系统时间:"
for i in 1 2 3 4 5
  do
    echo "$i-->$(date)";
  done

echo "[语法二] 输出五次系统时间:"
for i in {1..5}
  do
    echo "$i-->$(date)";
  done


echo -e "\n[语法三] 遍历根目录下所有文件:"
for item in `ls -d /s*`
  do
    echo "file: $item"
  done

echo -e "\n[语法四] 求和:"
#注意变量赋值的时候,=两边绝对不能有空格  
sum=0
for (( i=1; i<=100; i++ ))
  do
   sum=$(( $sum + $i ))
  done

echo "1+2+3+...+100=$sum" 
~

输出结果

[admin@localhost shell]$ ./for.sh 
[语法一] 输出五次系统时间:
1-->Wed Jun 21 17:18:34 CST 2017
2-->Wed Jun 21 17:18:34 CST 2017
3-->Wed Jun 21 17:18:34 CST 2017
4-->Wed Jun 21 17:18:34 CST 2017
5-->Wed Jun 21 17:18:34 CST 2017
[语法二] 输出五次系统时间:
1-->Wed Jun 21 17:18:34 CST 2017
2-->Wed Jun 21 17:18:34 CST 2017
3-->Wed Jun 21 17:18:34 CST 2017
4-->Wed Jun 21 17:18:34 CST 2017
5-->Wed Jun 21 17:18:34 CST 2017

[语法三] 遍历根目录下所有文件:
file: /sbin
file: /selinux
file: /srv
file: /sys

[语法四] 求和:
1+2+3+...+100=5050

2. while 循环

while 循环中可以使用break 和 continue进行跳出循环, 和Java 用法相同;

  • continue: 跳出本次循环, 执行下一次循环
  • break: 跳出整个while 循环

2.1 while 结构

while [ 条件判断式 ]  
  do  
    程序块儿  
    break/continue  
  done

2.2 示例程序

#!/bin/bash  

#计算1+2+3+...+100的和
i=1  
sum=0  
while [ $i -le 100 ]  
  do  
    sum=$(( $sum + $i ))  
    i=$(( $i + 1 ))  
  done  
echo "1+2+3+4+...+100=$sum"

输出结果:

[admin@localhost shell]$ ./while.sh 
1+2+3+4+...+100=5050
[admin@localhost shell]$

3. util 循环

util 表示一直循环执行到判断表达式为真时停止, 即当判断表达式为假时执行, 为真时停止执行.用until能实现的循环用while 和for 都能实现, 只是until 或许可读性更好一点儿而已.

3.1 语法结构

until [ 条件判断式 ]  
  do  
    程序块儿  
  done

3.2 示例程序

#!/bin/bash  

i=1  
sum=0  
until [ $i -gt 100 ]  
  do  
    sum=$(( $sum + $i ))  
    i=$(( $i + 1 ))   
  done  
echo "1+2+3+4+...+100=$sum"

测试输出:

[admin@localhost shell]$ ./until.sh 
1+2+3+4+...+100=5050
[admin@localhost shell]$

results matching ""

    No results matching ""