shell

shell.2.6 bash脚本编程(循环语句特殊应用)

 

循环执行:for循环、while循环、until循环;

进入条件:
for循环:列表元素非空;
while循环:条件测试结果为”真”;
until循环:条件测试结果为”假”;

退出条件:
for循环:列表元素遍历完成;
while循环:条件测试结果为”假”;
until循环:条件测试结果为”真”;

***************************

循环控制语句1:
          continue: 提前结束本轮循环,直接进入下一轮循环判断;

continue语法结构(以while循环为例):

while CONDITION1; do
  CMD1
  ...
  if CONDITION2; then
    continue
  fi
  CMD2
  CMD3
  ...
  CMDn
done

语法结构解释:
if语句判断CONDITION2的结果为”真”时,会触发’then’操作,结果是’continue’;
在循环语句段落中碰到’continue’,则本轮的循环会提前结束,也就是说’continue’下面的CMD2..CNDn都不会执行;
而是直接进入下一轮循环的判断;

举例:    计算100以内的正整数的偶数之和;

#!/bin/bash
#

declare -i even_sum=0
declare -i i=0

while [ $i -le 10 ]; do
  let i++
  if [ $[$i%2] -eq 1 ]; then
    continue
  fi
  let even_sum+=$i
done

echo "even sum is $even_sum"

循环控制语句2:
          break : 提前跳出循环;

break语法结构(以while循环为例):

while CONDITION1; do
  CMD1
  ...
  if CONDITION2; then
    break
  fi
  CMD2
  CMD3
  ...
  CMDn
done

举例:   计算100以内的正整数的奇数之和;

#!/bin/bash
#
declare -i odd_sum=0
declare -i i=1

while  true; do
  let odd_sum+=$i
  let i++
  if [ $i -gt 100 ]; then
    break
  fi
done

脚本解释:
‘true’表示死循环;当’$i’大于100时,直接跳出死循环;

举例: 每隔3秒钟查看用户maha是否有登录系统,如果登录系统则提示,并退出脚本;

#!/bin/bash
#
while true; do
  who | grep "^maha\>" &> /dev/null
  if [ $? -eq 0 ]; then
    echo "user maha is login system."
    echo -e "at `date +%m-%d-%Y\ %T`.\tuser maha is login system." >> maha_login.log
    break
  else
    echo "user maha is not login system."
  sleep 3
  fi
done

上面时间命令的引用,下面语句相同效果:
`date  +$Y-%m-%d\ %T`
`date  +%F\ %T`
$(date  +”%F %T”)

 

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

语法结构:

while  read  VARIABLE;  do
          循环体
done    < /PATH/FROM/SOMEFILE

语法结构解释:依次读取’/PATH/FROM/SOMEFILE’文件中的每一行,且将其赋值给’VARIABLE’变量;

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

#!/bin/bash
#

while read line; do
  user_id=$(echo $line | cut -d: -f3)
  
  user_name=$(echo $line | cut -d: -f1)
  user_shell=$(echo $line | cut -d: -f7)

  if [ $[$user_id%2] -eq 0 ]; then
    echo -e "$user_name\t$user_id\t$user_shell."
  fi
done < /etc/passwd
#!/bin/bash
#

while read line; do
  user_id=$(echo $line | cut -d: -f3)
  

  if [ $[$user_id%2] -eq 0 ]; then
    echo "$line" | cut -d: -f1,3,7 
  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 is $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

逆序打印九九乘法表:

#!/bin/bash
#

for ((j=9;j>=1;j--)); do
        for ((i=1;i<=j;i++)); do
                echo -e -n "${i}x${j}=$[${i}*${j}]\t"
        done
        echo
done

 

Leave a Reply

Your email address will not be published. Required fields are marked *