bash脚本编程


while CONDITION; do

循环体

done


进入条件:CONDITION为true;

退出条件:false


until CONDITION; do

循环体

done


进入条件:false

退出条件:true


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

#!/bin/bash
#
declare -i i=1
declare -i sum=0
until [ $i -gt 100 ]; do
    let sum+=$i
    let i++
done
echo "Sum: $sum"

示例:打印九九乘法表

#!/bin/bash
#
declare -i j=1
declare -i i=1
until [ $j -gt 9 ]; do
    until [ $i -gt $j ]; do
echo -n -e "${i}X${j}=$[$i*$j]\t"
        let i++
    done
    echo
    let i=1
    let j++
done


循环控制语句(用于循环体中):

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

done


break [N]:提前结束循环;

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

break

fi

CMDn

...

done


示例1:求100以内所有偶数之和;要求循环遍历100以内的所正整数;

#!/bin/bash
#
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]; do
    let i++
    if [ $[$i%2] -eq 1 ]; then
continue
    fi
    let sum+=$i
done
echo "Even sum: $sum"

创建死循环:

while true; do

循环体

done


until false; do

循环体

done


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

#!/bin/bash
#
read -p "Enter a user name: " username
while true; do
    if who | grep "^$username" &> /dev/null; then
break
    fi
    sleep 3
done
echo "$username logged on." >> /tmp/user.log 
第二种实现:
#!/bin/bash
#
read -p "Enter a user name: " username
until who | grep "^$username" &> /dev/null; do
    sleep 3
done
echo "$username logged on." >> /tmp/user.log

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


while read line; do

循环体

done < /PATH/FROM/SOMEFILE


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


示例:找出其ID号为偶数的所有用户,显示其用户名及ID号;

#!/bin/bash
while read line;do
        if [ $[`echo $line | cut -d: -f3` % 2] -eq 0 ];then
                echo -e -n "username: `echo $line | cut -d: -f1`\t"
                echo "uid: `echo $line | cut -d: -f3 `"
        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."


示例2:打印九九乘法表;

#!/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

练习:写一个脚本,完成如下任务

(1) 显示一个如下菜单:

cpu) show cpu information;

mem) show memory information;

disk) show disk information;

quit) quit

(2) 提示用户选择选项;

(3) 显示用户选择的内容;


#!/bin/bash
#
cat << EOF
cpu) show cpu information;
mem) show memory information;
disk) show disk information;
quit) quit
============================
EOF
read -p "Enter a option: " option
while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do
    read -p "Wrong option, Enter again: " option
done
if [ "$option" == 'cpu' ]; then
    lscpu
elif [ "$option" == 'mem' ]; then
    cat /proc/meminfo
elif [ "$option" == 'disk' ]; then
    fdisk -l
else
    echo "Quit"
    exit 0
fi

进一步地:

用户选择,并显示完成后不退出脚本;而是提示用户继续选择显示其它内容;直到使用quit方始退出;