10.1 当型和直到型循环语法


while时条件表达式成立之后,会进入循环体里面执行,不成立时退出,until循环语句的用法于while类似,区别在于在条件表达式不成立时候,进入循环执行指令,条件表达式成立时,终止循环。很少用until

while <条件表达式>

do

     指令....

done


当型和直到型循环的基本范例


每隔几秒输出一个系统负载,在脚本的结尾使用&符号在后台运行

#!/bin/bash

while true
do
  uptime
  #uptime >> /tmp/load.txt
  sleep 3
done

在实际工作中,一般会通过客户端ssh连接服务器,因此可能就会有在脚本或命令执行期间不能中断的需求,若中断,前功尽弃,更要命的会破坏系统数据,下面是防止脚本中断的几个可行方法;

1)利用 sh  /server/scripts/while_01.sh & 命令,即使用&在后台运行脚本

2)使用nohup  /server/scripts/uptime.sh  & 命令。即使用nohup加&在后台运行脚本

3)利用screen保持会话,然后在执行命令或脚本,即使用screen保持当前会话状态


1和2的差别在于,如果当前ssh远程连接的shell界面断开连接,1就会停止,而2不会停止


让shell脚本在后台运行的知识

用法                                       说明

sh while_01.sh           把脚本放到后台执行(在后台运行脚本的常用方法)

ctrl+c                         停止执行当前脚本

ctrl+z                         暂停执行当前脚本或任务

bg                              把当前脚本或任务放到后台执行,bg可以理解为background

fg                               把当前脚本或任务放到前台执行,

jobs                           查看当前执行的脚本或者任务

kill                             关闭执行的脚本任务,即以“kill % 任务编号”


竖向打印54321:

#!/bin/bash
i=5
while (($i>0)) 
do
  echo $i
  ((i--))
done
或者:
#!/bin/bash
i=5
while [ $i -gt 0 ]
do
  echo $i
  ((i--))
done
或者:
#!/bin/bash
i=5
while [[ $i > 0 ]]
do
  echo $i
  ((i--))
done

也可以使用$1传参的命令进行计算。


使用until进行判断:

#!/bin/bash
i=5
until [ $i -lt 1 ]
do
  echo $i
  ((i--))
done

计算从1加到100之间(请使用1+2+3...+100的方法)

#!/bin/bash
i=1
sum=0
while (($i<101)) 
do
  sum=$(($sum+$i))
  ((i++))
done
echo $sum

范例:猜数字游戏,首先让系统随机生成一个数字,给这个数字设定一个范围(1~60),让用户输入所猜的数字,游戏规则是:对输入进行判断,如果不符合要求,就给予高或低的提示,猜对后则给出所用的次数,请用while实现。

自己写的简易版本的:
#!/bin/bash

export LANG="zh_CN.UTF-8"
a=$(($RANDOM%61))
b=1

echo "这个擀面皮"$a"元"
sleep 2
echo "----------------"
clear
echo "这个面皮多钱?请输入0-60的价格"

read -p "请输入你的价格:" num

if [ $num -eq $a ]; then
  echo $b
  exit 1
else
  num1=$num
fi

while [ $num1 -ne $a ]
do
  if [ $num1 -gt $a ]; then
    echo "这个价格有点高"
  elif [ $num1 -lt $a ]; then
    echo "这个价格有点低"
  else
    echo  "恭喜你猜对了"
    return 0
  fi
read -p "再次输入价格:" num1
((b++))
done
echo “你共猜了"$b"次才才猜对的,很笨”

范例10-5:手机充值10元,每发 一次短信(输出当前余额)花费1角5分钱,当余额低于1角5分钱的时候就不能在发短信了,提示“余额不足,请充值”(允许用户充值后继续发短信),请用while语句实现。

目前写的最专业,最好的脚本
#!/bin/bash

export LANG="zh_CN.UTF-8"

sum=15               #初始费用
b=15                 #发一次短信需要的费用

me() {
cat <<EOF
当前余额为$sum,余额不足,请充值
==============================

    1.充值
    2.发消息
    3.退出
==============================

EOF
}
chong() {
read -p "请输入充值金额:" num

expr $num + 10 >/dev/null
js=$?
if [ $js -eq 0 ]; then
  sum=$(($sum+$num))
  printf "充值成功,充了$num,现在还有"$sum"话费\n"
else
  echo "这是一个错误的数字" 
#  return 0
fi

}
send() {
if [ $sum -ge 15 ]; then
  sum=$(($sum-$b))
  printf "发送一条短信,现在还有“$sum”话费,请及时充值\n"

else
  printf "余额不足,请充值\n"

  sleep 3

  chong
fi
}



main() {
me
while true
do
read -p "your choices:" dd
case "$dd" in
  1)
    chong
    ;;
  2)
    send
    ;;
  3)
    exit 5
    ;;
  *)
    echo "this is a bad"
esac

done

}

main

image.png