3.逻辑控制——循环

一、循环类型

  • for循环
  • while循环

二、for循环

1、for循环的语法

for 变量 in 取值列表; do
	执行的操作
done

for 变量 in 取值列表
do
	执行的操作
done

需求: 在/tmp目录创建20个测试文件

[root@node01 work]# cat create_file.sh 
#!/bin/bash
#

for i in $(seq 20); do
    touch /tmp/$(openssl rand -hex 10)
done
#!/bin/bash
#

for i in $(seq 20); do
    touch /tmp/file${i}
done

需求: 批量创建用户

#!/bin/bash
#

for i in $(seq 10); do
   if id user$i &> /dev/null; then
      echo "用户user${i}存在"
   else
      useradd user$i
   fi
done
#!/bin/bash
#

for name in $(cat /tmp/userlist); do
    if id $name &> /dev/null; then
       echo "用户${name}存在"
    else
       useradd $name
       echo "用户${name}创建完成"
    fi
done

需求: 多线程检测10.11.9.0/24在线IP

[root@node01 work]# cat check_ip.sh 
#!/bin/bash
#

subnet=10.11.9.

for i in $(seq 254); do
    {
    ip=$subnet$i
    if ping -c 1 -W 1 $ip &> /dev/null; then
       echo "Host $ip is up"
    fi
    }&
done
wait

需求: 检测目录间文件差异, 针对复制场景

#!/bin/bash
#

for src_file in $(find /tmp/bj -type f); do
    # 将bj替换为sh,获取同名的文件 
    dest_file=${src_file/bj/sh/}
    
    if [ ! -e $dest_file ]; then
       echo "文件$dest_file丢失"
    else
       src_file_md5=$(md5sum $src_file | awk '{print $1}')
       dest_file_md5=$(md5sum $dest_file | awk '{print $1}')
       if [ $dest_file_md5 != $src_file_md5 ]; then
          echo "文件${dest_file}数据不一致"
       fi
    fi

字符串替换

[root@node01 work]# data=abc
[root@node01 work]# echo ${data/b/K}
aKc

需求:找出10分钟内启动的进程

[root@node01 work]# cat find_process.sh 
#!/bin/bash
#

# 获取当前时间
now=$(date +%s)

for proc_id in $(ps -eo pid | sed '1d'); do
    proc_start_time=$(ps -p $proc_id -o lstart=)
    proc_start_timestap=$(date -d "$proc_start_time" +%s)
    # 判断10分钟内启动的进程 
    let offset=now-proc_start_timestap 
    if [ $offset -lt 600 ]; then
       echo "进程ID:$proc_id, 进程名称: $(ps -p ${proc_id} -o comm=)"
    fi
done

三、while循环

1、基本语法

while 条件; do
	执行操作
done
#!/bin/bash
#

i=1

while [ $i -le 10 ]; do
    touch /tmp/$(openssl rand -hex 10)
    let i++
done

2、while true循环

while true; do
	执行操作
done
#!/bin/bash
#

while true; do
    uptime
    sleep 2
done

3、while read line循环

3.1 遍历文件

遍历文件, 变量line相当于文件中的每一行内容
while read line; do
	执行操作
done < 文件名称
#!/bin/bash
#

while read line; do
     name=$(echo $line | awk -F: '{print $1}')
     password=$(echo $line | awk -F: '{print $2}')
     uid=$(echo $line | awk -F: '{print $3}')
     gid=$(echo $line | awk -F: '{print $4}')
     comment=$(echo $line | awk -F: '{print $5}')
     home_dir=$(echo $line | awk -F: '{print $6}')
     shell=$(echo $line | awk -F: '{print $7}')

     mysql -uroot -pWWW.1.com -e "insert into it.passwd(name,password,uid,gid,comment,home_dir,shell) values('$name','$password',$uid,$gid,'$comment','$home_dir','$shell')"
done < /etc/passwd

3.2

shell命令 | while read line; do
	执行操作
done

需求: 检测磁盘使用率>20%, 磁盘名称、总容量、剩余容量

#!/bin/bash
#

df -hT | grep "^/dev" | while read line; do
    usage=$(echo $line | awk '{print $6}' | awk -F% '{print $1}')
    if [ $usage -gt 20 ]; then
        disk_name=$(echo $line | awk '{print $7}')
        total_size=$(echo $line | awk '{print $3}')
        free_size=$(echo $line | awk '{print $5}')
        echo "磁盘名称: $disk_name, 总容量: $total_size, 剩余容量: $free_size" 
    fi

四、中断循环的操作

1、break

  • 中断整个循环
#!/bin/bash
#

for i in $(seq 5); do
    if [ $i -eq 3 ]; then
       break
    fi
    echo "第$i次循环开始"
    echo "---------------"
    echo "第$i次循环结束"
done

2、continue

  • 中断本次循环, 忽略某一次操作
#!/bin/bash
#

for i in $(seq 5); do
    if [ $i -eq 3 ]; then
       continue 
    fi
    echo "第$i次循环开始"
    echo "---------------"
    echo "第$i次循环结束"
done

需求: 显示前5个系统用户

#!/bin/bash
#

count=1

while read line; do
    user_id=$(echo $line | awk -F: '{print $3}')
    if [ $user_id -ge 1 -a $user_id -le 199 ]; then
       echo $line | awk -F: '{print $1}'
       let count++
    fi
    if [ $count -eq 6 ]; then
       break
    fi
done < /etc/passwd 
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值