逻辑控制——循环
一、循环类型
- 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