1. 循环语法基础结构
1.1. for 结构
1.1.1. 列表循环
列表 for 循环:用于将一组命令执行已知的次数
for variable in {list}
	do
		command1
		command2
		...
	done
或者
for variable in a b c
	do 
		command1
		command2
		...
	done
1.1.2. 不带列表循环
for variable 
	do
		command1
		command2
		...
	done
1.1.3. 类 C 风格的 for 循环
- 基本语法结构
 
for (( expr1;expr2;expr3 )) 
	do
		command1
		command2
		...
	done
1.1.4. 学习示例
打印1至50
#!/bin/bash
for i in {0..50..2}
do
    echo ${i}
done
# 类 c 风格
for (( i=1; i<=50; i++))
do
   echo ${i}
done
1.2. while 结构
条件为真进入循环,条件为假则退出循环
while 表达式
	do
		command1
	done
示例:用 while结构循环打印1-5
i=1
while [[ ${i} -le 5 ]];
do
	echo ${i}
	let i++
done	
1.3. until 结构
条件为假就进入循环,条件为真退出循环
until 表达式 # 退出循环条件
do
	command1
	command2
	...
done
学习示例
#!/bin/bash
n=10
until [ $n -lt 1 ]
do
    n=$[ $n - 1 ]
done
echo "n: "$n
# chen @ localhost in ~/Shell [17:25:38] C:1
$ chmod +x test_for2.sh 
# chen @ localhost in ~/Shell [17:25:55] 
$ ./test_for2.sh 
n: 0
2. 嵌套循环语法结构
- 一个循环体内包含另一个完整的循环结构
 - 每次循环都会触发内部循环,直至内部循环完成,才接着执行下一次的外部循环
 - for 循环、while循环和 util循环可以相互嵌套
 
3. 练习案例
3.1. 计算 1-100 奇数的和
#!/usr/bin/env bash
#
sum=0
for i in {1..100..2} ;
do
    let sum=${sum}+${i}
done
echo "1-100奇数和: "${sum}
# 方法2
for (( i=1; i<=50; i++ ))
do
    test $[${i}%2] -ne 0 && let sum=${sum}+${i}
done
echo "1-100奇数和: "${sum}
3.2. 判断质数
判断用户输入的数是否为质数
#!/usr/bin/env bash
read -p "请输入一个正整数: " number
expr ${number} + 0 &> /dev/null
[[ $? -eq 0 ]] ||  echo "输入数不是整数"; exit
[[ ${number} -eq 1 ]] && echo "${number} 不是质数" && exit
[[ ${number} -eq 2 ]] && echo "${number} 是质数" && exit
for i in $( seq 2 $[ $[ ${number}-1 ]/2 ]) ; do
    [[ $[ ${number}%${i} ]  -eq 0 ]] &&  echo "${number} 不是质数" && exit
done
echo "${number} 是质数"
3.3. 局域网内检查主机网络通信
局域网内,把能 ping 通的 ip 和不能 ping 通的 IP 分类,并保存到两个文件中
#!/usr/bin/env bash
ip=192.168.10
for (( i = 1; i <= 254; ++i ))
do
{   ping -c1 ${ip}.${i} &> /dev/null
    if [[ $? -eq 0 ]];then
        echo "---${ip}.${i} is ok---" | tee -a /tmp/ip_up.txt
    else
        echo "---${ip}.${i} is down---" | tee -a /tmp/ip_down.txt
    fi
#    [[ $? -eq 0 ]] && echo "${ip}.${i} is ok" >> /tmp/ip_up.txt || echo "${ip}.${ip} is down" >> /tmp/ip_down.txt
}&
done
wait
echo "-----------------------检测完毕---------------------"
注: 这个示例中使用并行执行:
{程序}& 表示将程序放到后台并执行,如果需要等待程序执行完毕在进行下面内容,需要加 wait
3.4. 脚本同步系统时间
3.4.1 具体需求
- 每隔30秒同步一次系统时间,时间同步服务器 192.168.10.96
 - 如果同步失败,则进行邮件报警,每次失败都报警
 - 同步成功,也进行邮件报警,但是成功100次才通知一次
 
3.4.2 脚本实现
#!/usr/bin/env bash
# Auth: chen
# Email: chen3494269@163.com
# Desc: 同步系统时间
# Func: 每隔 30 秒同步一次系统时间,时间同步服务器 192.168.10.96
#       如果同步失败,则进行邮件报警,每次失败都报警
#       同步成功,也进行邮件报警,但是成功100次才通知一次
# Date: 2019/10/10
# Version: v1.0
NTP_SERVER=192.168.10.96
count=0
SUCCESS_NUM=100
while true;
do
    ntpdate ${NTP_SERVER} &> /dev/null
    if [[ $? -ne 0 ]]; then
        echo "system data failed" | mail -s "check system date" root@localhost
    else
        let count++
        if [[ ${count} -eq ${SUCCESS_NUM} ]]; then
            echo "system data failed" | mail -s "check system date" && count=0          
        fi
    fi
sleep 30
done
3.5. 打印指定图案
3.5.1 图案
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
3.5.2 脚本实现
#!/usr/bin/env bash
for i in {1..5}
do
    for (( j = 1; j <= ${i}; ++j ))
    do
        echo -n ${j}
    done
    # 换行
    echo
done
3.5.3 图案
5
5 4
5 4 3
5 4 3 2
5 4 3 2 1
3.5.4 脚本实现
for i in {1..5}
do
    for (( j = 5; j >= 6-${i} ; --j ))
    do
        echo -n ${j}
    done
    # 换行
    echo
done
                                    来源:CSDN
作者:小丑先生呀
链接:https://blog.csdn.net/weixin_45080984/article/details/103655516