bash脚本编程:顺序执行  选择分支   循环执行


进入条件:

for:列表元素非空;

while:条件测试结果为“真”

unitl:条件测试结果为“假”

退出条件:

for:列表元素遍历完成;

while:条件测试结果为“假”

until:条件测试结果为“真”



循环控制语句:

continue:提前结束本轮循环,而直接进入下一轮循环判断;

while  CONDITION1; do

CMD1

...

if  CONDITION2; then

continue

fi

CMDn

...

done


            示例:求100以内所有偶数之和;

#!/bin/bash

#

declare -i evensum=0

declare -i i=0


while [ $i -le 100 ]; do

let i++

if [ $[$i%2] -eq 1 ]; then

continue 注:当eq=1就开始不往下执行了,开始新一轮循环

fi

let evensum+=$i

done

                echo "Even sum: $evensum"



break:提前跳出循环

退出方式:某个测试条件满足时,让循环体执行break命令;

格式: while  CONDITION1; do

CMD1

...

if  CONDITION2; then

break

fi

done

创建死循环:

while true; do

循环体

done

示例:求100以内所奇数之和

#!/bin/bash

#

declare -i oddsum=0

declare -i i=1


while true; do

let oddsum+=$i

let i+=2

if [ $i -gt 100 ]; then

break 注:当$i大于100时退出循环

fi

done




sleep命令:程序的睡眠时间


格式:sleep NUMBER

练习:每隔3秒钟到系统上获取已经登录用户的用户的信息;其中,如果logstash用户登录了系统,则记录于日志中,并退出;

#!/bin/bash

#

while true; do

if who | grep "^logstash\>" &> /dev/null; then

break

fi

sleep 3

done


echo "$(date +"%F %T") logstash logged on" >> /tmp/users.log

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

#!/bin/bash

#

until who | grep "^logstash\>" &> /dev/null; do

sleep 3

done

echo "$(date +"%F %T") logstash logged on" >> /tmp/users.log





while循环的特殊用法(遍历文件的行):

格式:

while  read  VARIABLE; do

循环体;

done  <  /PATH/FROM/SOMEFILE

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将基赋值给VARIABLE变量;


示例:找出ID号为偶数的用户,显示其用户名、ID及默认shell;

#!/bin/bash

#

while read line; do

userid=$(echo $line | cut -d: -f3)

username=$(echo $line | cut -d: -f1)

usershell=$(echo $line | cut -d: -f7)


if [ $[$userid%2] -eq 0 ]; then

echo "$username, $userid, $usershell."

fi

done < /etc/passwd




for循环的特殊用法:


格式: for  ((控制变量初始化;条件判断表达式;控制变量的修正语句)); do

循环体

done

控制变量初始化:仅在循环代码开始运行时执行一次;

控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做条件判断;

示例:求100以内所有正整数之和

#!/bin/bash

#

declare -i sum=0


for ((i=1;i<=100;i++)); do

let sum+=$i

done


echo "Sum: $sum."

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

示例:打印九九乘法表

#!/bin/bash

#

for ((j=1;j<=9;j++)); do

for ((i=1;i<=j;i++)); do

echo -e -n "${i}X${j}=$[${i}*${j}]\t"

done

echo

done