bash脚本编程:循环执行
for, while, until
进入条件:
for:列表元素非空;
while:条件测试结果为“真”
unitl:条件测试结果为“假”退出条件:
for:列表元素遍历完成;
while:条件测试结果为“假”
until:条件测试结果为“真”-
循环控制语句:
-
continue:提前结束本轮循环,而直接进入下一轮循环判断;
while CONDITION1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done
-
break:提前跳出循环
while CONDITION1; do CMD1 ... if CONDITION2; then break fi done
-
sleep命令:
- delay for a specified amount of time
sleep NUMBER
练习
每隔3秒钟到系统上获取已经登录用户的用户的信息;其中,如果logstash用户登录了系统,则记录于日志中,并退出;
[root@localhost ~]# bash /scripts/e16-1.sh
logstash pts/2 2019-03-16 06:13 (192.168.223.1)
[root@localhost ~]# tail /tmp/users.log
logstash login
[root@localhost ~]# cat /scripts/e16-1.sh
#!/bin/bash
while true;do
who | grep logstash
if [ $? -eq 0 ];then
echo "logstash login" >> /tmp/users.log
break
fi
sleep 3
done
while循环的特殊用法(遍历文件的行):
while read VARIABLE; do
循环体;
done < /PATH/FROM/SOMEFILE
示例:找出ID号为偶数的用户,显示其用户名、ID及默认shell;
[root@localhost ~]# bash /scripts/e16-2.sh
root:0:/bin/bash
daemon:2:/sbin/nologin
lp:4:/sbin/nologin
shutdown:6:/sbin/shutdown
mail:8:/sbin/nologin
games:12:/sbin/nologin
ftp:14:/sbin/nologin
systemd-network:192:/sbin/nologin
sshd:74:/sbin/nologin
chrony:998:/sbin/nologin
fedora:4004:/bin/bash
archlinux:4006:/bin/bash
tcpdump:72:/sbin/nologin
saslauth:996:/sbin/nologin
apache:48:/sbin/nologin
haproxy:188:/sbin/nologin
[root@localhost ~]# cat /scripts/e16-2.sh
#!/bin/bash
while read line;do
uid=$(echo $line |cut -d':' -f3)
if [ $[$uid%2] -eq 0 ];then
echo $line |cut -d: -f1,3,7
fi
done < /etc/passwd
for循环的特殊用法:
for ((控制变量初始化;条件判断表达式;控制变量的修正语句)); do
循环体
done