shell之循环

一、for循环语句

1.1 for循环语句结构

1)列表循环

列表for循环:用于将一组命令执行已知的次数!

语法结构:

for variable in {list}
     do
          command 
          command
          …
     done

或者

for variable in a b c
     do
         command
         command
     done

举例说明:

# for var in {1..10};do echo $var;done
# for var in 1 2 3 4 5;do echo $var;done
# for var in `seq 10`;do echo $var;done
# for var in $(seq 10);do echo $var;done
# for var in {0..10..2};do echo $var;done
# for var in {2..10..2};do echo $var;done
# for var in {10..1};do echo $var;done
# for var in {10..1..-2};do echo $var;done
# for var in `seq 10 -2 1`;do echo $var;done
2)不带列表循环

不带列表的for循环:执行时由用户指定参数和参数的个数!

语法结构:

for variable
    do
        command 
        command
        …
   done

举例说明:

#!/bin/bash
for var
do
echo $var
done

echo "脚本后面有$#个参数"
3)类C风格的for循环

基本语法:

for(( expr1;expr2;expr3 ))
    do
        command
        command
        …
    done

expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出

举例说明:

 # for ((i=1;i<=5;i++));do echo $i;done
 # for ((i=1;i<=10;i+=2));do echo $i;done
 # for ((i=2;i<=10;i+=2));do echo $i;done

2.2 应用示例

1)脚本计算1~100的奇数的和
#!/bin/bash

# 定义变量来保存奇数和
sum=0

#for循环遍历1-100的奇数,并且相加,把结果重新赋值给sum
for i in {1..100..2}
do
    let sum=$sum+$i
done
#打印所有奇数的和
echo "1-100的奇数和是:$sum"

控制循环语句的参数:

  • continue:继续;表示循环体内的代码不再执行,直接开始下一次循环;
  • break:打断;马上停止执行本次循环,执行循环体后的代码;
  • exit:表示直接跳出程序;
#!/bin/bash
for i in {1..5}
do
    test $i -eq 2 && break || touch /tmp/file$i
done
#当脚本等于2时,停止循环,脚本结束
2)批量创建用户

批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123 !

#!/bin/bash
#判断class组是否存在
grep -w class /etc/group &>/dev/null
[ $? -ne 0 ] && groupadd class
#批量创建5个用户
for i in {1..5}
do
    useradd -G class u$i
    echo 123|passwd --stdin u$i
done

批量新建5个用户stu1~stu5,要求这几个用户的家目录都在/rhome !

#!/bin/bash
#判断/rhome是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
test ! -f /rhome -a ! -d /rhome && mkdir /rhome
#创建用户,循环5次
for ((i=1;i<=5;i++))
do
    useradd -d /rhome/stu$i stu$i
    echo 123|passwd --stdin stu$i
done
3)局域网网内脚本检查网络是否可以正常通信

写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里!

#!/bin/bash
#定义变量
ip=10.1.1
#循环去ping主机的IP
for ((i=1;i<=254;i++))
do
    ping -c1 $ip.$i &>/dev/null
    if [ $? -eq 0 ];then
        echo "$ip.$i is ok" >> /tmp/ip_up.txt
    else
        echo "$ip.$i is down" >> /tmp/ip_down.txt
    fi
done	

shell脚本并行处理:

并行执行:
{程序}&表示将程序放到后台并行执行,如果需要等待程序执行完毕再进行下面内容,需要加wait

#!/bin/bash
#定义变量
ip=10.1.1
#循环去ping主机的IP
for ((i=1;i<=254;i++))
do
{

        ping -c1 $ip.$i &>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip.$i is ok" >> /tmp/ip_up.txt
        else
                echo "$ip.$i is down" >> /tmp/ip_down.txt
        fi
}&
done
wait
echo "ip is ok...."
4)判断闰年

输入一个年份,判断是否是润年(能被4整除但不能被100整除,或能被400整除的年份即为闰年)!

#!/bin/bash
read -p "Please input year:" year
if [ $[$year%4] -eq 0 -a $[$year%100] -ne 0 ];then
    echo "$year is leap year"
elif [ $[$year%400] -eq 0 ];then
    echo "$year is leap year"
else
    echo "$year is not leap year"
fi

二、while循环语句

while循环语句的特点:条件为真就进入循环,条件为假就退出循环!

2.1 while循环语法结构

while 表达式
do
        command...
done

或者

while  [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
     command
     command
     ...
done

循环打印1~5数字

#for循环打印
for ((i=1;i<=5;i++))
do
    echo $i
done
#while循环打印
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done

2.2 应用示例

1)计算1~50偶数的和
#!/bin/bash
#定义变量
sum=0
i=2
#循环打印1-50的偶数和并且计算后重新赋值给sum
while [ $i -le 50 ]
do
    let sum=sum+i
    let i+=2
done
#打印sum的值
echo "1-50的偶数和为:$sum"
2)脚本同步系统时间
#!/bin/bash
#定义变量
count=0
ntp_server=10.1.1.1
while true
do
    rdate -s $ntp-server &>/dev/null
    if [ $? -ne 0 ];then
        echo "system date failed" |mail -s 'check system date'  root@localhost  
    else
        let count++
        if [ $[$count%100] -eq 0 ];then
        echo "system date successfull" |mail -s 'check system date'  root@localhost && count=0
        fi
    fi
sleep 3
done

三、until循环

until循环特点:条件为假进入循环,条件为真退出循环!

3.1 until循环语句结构

until 表达式
do
        command
        command
        ...
done

循环打印1~5数字

#while循环打印
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done
#until循环打印
i=1
until [ $i -gt 5 ]
do
    echo $i
    let i++
done

3.2 应用示例

1)使用until语句批量创建10个用户,要求stu1—stu5用户的UID分别为1001—1005;
2)stu6~stu10用户的家目录分别在/rhome/stu6—/rhome/stu10

#!/bin/bash
i=1
until [ $i -gt 10 ]
do
    if [ $i -le 5 ];then
        useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
    else
        [ ! -d /rhome ] && mkdir /rhome
        useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i      
    fi
let i++
done
posted @ 2020-12-27 22:06  吕振江  阅读(434)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end