循环

for

语法

for 变量 in 值1 值2 值n
do
    命令1
    命令2
    命令n
done

终端写法

$ for 变量 in 值1 值2 值n; do 命令1; 命令2; 命令n; done

示例

循环一组数字

for i in 1 2 3 4 5; do
    echo "这是第 $i 次循环"
done

输出

这是第 1 次循环
这是第 2 次循环
这是第 3 次循环
这是第 4 次循环
这是第 5 次循环

循环输出字符串

for i in "This is a string";
do
    echo "$i"
done

遍历一个目录下的所有文件

#!/bin/bash

cd /root/for/100/

for a in `ls /root/for/100/`    # 将ls的结果赋值给$a
do
	[ -d $a ] && ls $a          # -d判断$a是否为目录,如果是则执行ls $a
	if [ -d $a ]
	then
		echo $a
		ls $a
	fi
done

while

语法

while 条件
do
    命令1
    命令2
    ...
done

示例

循环累加数字

int=1
while [ $int -le 5 ]
do
	echo $int
	let "int++"
done

$int小于等于5则一直循环。let是终端命令,用于计算变量中的值。let "int++"表示每次循环$int加1。

每隔1分钟检查一下系统负载,当系统的负载大于10的时候,发一封邮件(监控脚本)

while :
do
    load=`uptime | awk -F': ' '{print $NF}' | awk -F'.' '{print $1}'`
    if [ $load -gt 10 ]
    then
        /usr/local/sbin/mail.py
    fi
    sleep 60
done

while :表示死循环,还可以用1``true表示。sleep 60表示每隔60秒执行一次。

根据输入的内容,输出对应的结果

while :
do
	read -p "Please input a number: " num
    	if [ -z "$num" ]
    	then
        	echo "You must input a number."
		continue
    	fi
    	n1=`echo $num|sed 's/[0-9]//g'`
    	if [ -n "$n1" ]
    	then
        	echo "Input error."
		continue
    	fi
		break
done
echo $num

# 运行效果
[root@lwz1 ~]# sh while2.sh
Please input a number:
You must input a number.
Please input a number: a
Input error.
Please input a number: 11
11
  • read交互式输入。-p表示提示信息

  • if中的-z表示判断字符串是否为空。-n表示判断字符串是否为非空。

  • continue表示继续下一次循环。

  • break表示跳出循环。

跳出循环

break 跳出循环

for i in `seq 1 5`
do
	echo a=$i
	if [ $i -eq 3 ]
	then
	break
	fi
	echo b=$i
done
echo c=$i

# 运行效果
[root@lwz1 ~]# sh while4.sh
a=1
b=1
a=2
b=2
a=3
c=3

exit 退出整个脚本

for i in `seq 1 5`
do
        echo a=$i
        if [ $i -eq 3 ]
        then
        exit
        fi
        echo b=$i
done
echo c=$i

# 运行效果
[root@lwz1 ~]# sh while4.sh
a=1
b=1
a=2
b=2
a=3

break的区别是,break$b执行前结束整个循环,然后执行循环外的$c。而exit则在$b执行前直接结束整个脚本。

continue 跳出本次循环

for i in `seq 1 5`
do
        echo a=$i
        if [ $i -eq 3 ]
        then
        continue
        fi
        echo b=$i
done
echo c=$i

# 运行效果
[root@lwz1 ~]# sh while4.sh
a=1
b=1
a=2
b=2
a=3
a=4
b=4
a=5
b=5
c=5

$i=3时,continue会忽略当前循环,然后继续执行下一次循环。