一、while的语法格式
二、until的语法格式
三、示例与练习
四、补充
一、while的语法格式
------------------------------------------
while 测试条件; do
语句1
语句2
······
done
------------------------------------------
条件满足时就循环,直到条件不满足,则退出循环
退出循环的方法之一:在循环体中改变测试条件相应变量的值,如示例1中,$I的值大于100则退出循环
常用于遍历文件每一行内容,如示例3
while read LINE; do
语句1
语句2
······
done < /path/to/somefile
二、until的语法格式
------------------------------------------
until 测试条件;do
语句1
语句2
······
done
------------------------------------------
条件不满足就循环,直到满足时退出循环,例如示例5,直到I大于100时,退出循环
三、示例与练习
示例1:计算100以内所有正整数的和
#!/bin/bash
#
Sum=0 #如果希望变量中存储的值为整数型,最好使用let Sum=0或declare -i Sum=0这种形式
I=1
while [ $I -le 100 ];do
let Sum+=$I #算术运算写成这种格式要注意不要漏掉let
let I++ #算术运算写成这种格式要注意不要漏掉let
done
echo "Sum:$Sum"
示例2:计算100以内所有偶数的和
#!/bin/bash
#
EvenSum=0 #如果希望变量中存储的值为整数型,最好使用let EvenSum=0或declare -i EvenSum=0这种形式
I=0
while [ $I -le 100 ]; do
let EvenSum+=$I
let I++
let I++
done
echo "EvenSum:$EvenSum"
或
#!/bin/bash
#
EvenSum=0
I=0
while [ $I -le 100 ]; do
if [ $[$I%2] -eq 0 ]; then #除二取余为0时
let EvenSum+=$I
fi
let I++
done
示例3:如果用户的ID号为偶数,则显示其名称和shell;对所有用户执行此操作
#!/bin/bash
#
while read Line; do
Uid=`echo $Line | cut -d: -f3`
if [ $[$Uid%2] -eq 0 ]; then #除二取余为0时
echo $Line | cut -d: -f3,7
fi
done < /etc/passwd #此时while语句实现了一行一行遍历整个文件内容
示例4:转换用户输入的字符为大写,输入quit时则退出
#!/bin/bash
#
read -p "A string [quit for quiting]:" String
while [ "$String" != quit ]; do #一定要用双引号,字符串有空格时会报错
echo $String | tr 'a-z' 'A-Z'
read -p "Next String [quit for quiting]:" String
done
示例5:计算100以内所有正整数的和
#!/bin/bash
#
Sum=0
I=1
until [ $I -gt 100 ]; do #直到I的值大于100才退出
let Sum+=$I
let I++
done
echo "Sum:$Sum"
示例6:每隔5秒查看hadoop用户是否登录,如果登录,显示其登录并退出;否则,显示当前时间,并说明hadoop尚未登录(while 简写)
#!/bin/bash
#
until who | grep "^hadoop" &> /dev/null; do
date
sleep 5
done
echo "hadoop is logged in."
或
#!/bin/bash
#
who | grep "^hadoop" &> /dev/null
Ret=$?
until [ $Ret -eq 0 ]; do #grep匹配到时,命令执行状态返回值是0,未匹配到则是非0 date
sleep 5
done
echo "hadoop is logged in."
或
#!/bin/bash
#
who | grep "^hadoop" &> /dev/null
Ret=$?
while [ $Ret -ne 0 ]; do
date
sleep 5
who | grep "^hadoop" &> /dev/null
Ret=$? #再次取得命令执行状态的返回值
done
echo "hadoop is logged in."
练习1:写一个脚本:
1) 显示一个菜单给用户:
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
2) 当用户选择完成,显示相应信息后,不退出;而让用户再一次选择,再次显示相应内容;除了用户使用quit
#!/bin/bash
# Date: 2015-04-20
# Author: ArvinLau
# Description:
# Version: 1.0
cat << EOF
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF
Ret=0 #自定义退出的命令执行状态返回值,通过until语句的直到满足条件,否则一直循环完成练习
until [ "$Ret" -eq 9 ];do
read -p "Give a choice:" Choice
case $Choice in
d|D)
df -lh;;
m|M)
free -m;;
s|S)
cat /proc/swaps;;
quit)
echo "Quit."
exit 9;; #自定义命令执行状态返回值
*)
echo -n "Invalid input,";;
esac
Ret=$? #只要不是自定义的9,就会不断循环
done
或
#!/bin/bash
# Date: 2015-04-20
# Author: ArvinLau
# Description:
# Version: 1.0
cat << EOF
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF
until [ "$Choice" == quit ];do #当变量字符串是quit时,退出循环
read -p "Give a chioce:" Choice
case $Choice in
d|D)
df -lh;;
m|M)
free -m;;
s|S)
cat /proc/swaps;;
quit)
echo "Quit."
exit 9;;
*)
echo -n "Invalid input,";;
esac
done
四、算术运算符
下面每行的运算表达式,运算结果都相同
Sum=$[$Sum+$M] let Sum+=$M
------------------------------------------
Sum=$[$Sum+1] let Sum+=1 let Sum++ #变量自身+1
------------------------------------------
Sum=$[$Sum-$M] let Sum-=$M
------------------------------------------
Sum=$[$Sum*$M] let Sum*=$M
------------------------------------------
Sum=$[$Sum/$M] let Sum/=$M
------------------------------------------
Sum=$[$Sum%$M] let Sum%=$M
转载于:https://blog.51cto.com/64314491/1636240