note_16.1_shell脚本continue、break、while行读文件、for((;;))

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

你可能感兴趣的:(note_16.1_shell脚本continue、break、while行读文件、for((;;)))