您的位置:首页 > 其它

循环for,while,until

2016-08-17 16:54 183 查看
shell中的循环语句一般有:
for while until

一、for
for 变量名 in 列表;do
循环体
done

首先将in后list列表的第一个常数或字符串赋值给循环变量,
然后执行循环体;依次赋值列表中的字段,最后执行done命令后的命令序列。
list列表生成方式:
(1) 直接给出列表 1 2 3
(2) 整数列表:
(a) {start..end} {1..10}
(b) $(seq [start [step]] end) `seq 1 10`
(3) 返回列表的命令 $(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用; $@, $*

提示输入正整数n的值,计算1+2+3+…n的 总和
read -p "please enter a positive integer:" n
for i in $(seq 1 $n 2>/dev/null);do
let s+=i
done
done
echo "sum=$s"


特殊用法:类似C语言for

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done

双小括号:实现C风格变量操作 ((i++))
控制变脸初始化:仅在第一次循环时执行

控制变量的修正表达式:会在进入下一轮循环前先执行

1到100正整数和for实现
for((i=1;i<=100;i++));do
let sum+=i
done
echo $sum


二、while
while CONDITION; do
循环体
done
条件为真,执行循环;
条件为假,退出循环。
直到不符合条件则退出循环

CONDITION:循环控制条件;进入循环之前,先做一次判断;每次循环后再次判断;
CONDTION变量的值应为变化的;应该在循环体不断地被修正;创造退出循环的条件

1到100内所有正整数和while实现
i=1
while [ $i -le 100 ];do
let s=s+i
let i++
done
echo "$s"


特殊用法:
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
依次读取文件中的每一行复制给变量line

扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填 充用户名和单位电话为62985600,
并提示该用户的GECOS信 息修改成功。
while read line ;do
user=`echo $line|cut -d: -f1`
gc=`echo $line|cut -d: -f5`
[ -z $gc ]&>/dev/null && usermod -c "$user 62985600" $user && printf "%-12s %s\n" $user
"GECOS changed"
done < /etc/passwd
echo finished


三、until

until CONDITION; do
循环体
done
条件为假,执行循环
条件为真,退出循环

直到符合条件退出循环

1到100正整数和until实现
i=0
until [ $i -gt 100 ];do
let sum+=i
let i++
done
echo $sum


循环控制语句:
一般结合判断语句使用,用于跳过某些指定情况

1)continue # #为第几层,最内层为1层
提前结束第#层的本轮循环,直接进入#层下一轮判断。

2)break # 结束#层循环,最内层为1层
直接结束#层循环体,#层后续的循环不再执行。

作业:

1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。
#!/bin/bash
#
echo
until w|cut -d ' ' -f1|grep "hacker" ;do
let i++
echo -e "\b\r$i \t `date` \t no hacker"
sleep 3
done
echo "should logout"|mail -s 'warning' hacker
echo "is here ! ! !"
echo -e "`date` warning! `w|grep "^hacker"`">>/var/log/messages


2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
#!/bin/bash
#
n=$[RANDOM%11]
num=a
until [ $num -eq $n ]&>/dev/null;do
read -p "please enter a numbe [0-10]:" num
if [ -z $num ] ;then
continue 2
elif [[ ! $num =~ 1?[0-9] ]] ;then
continue 2
elif [ $num -gt $n ] ;then
echo "    your number is bigger"
elif [ $num -lt $n ] ;then
echo "    your number is smaller!"
fi
done
echo you hit the number!  $n


3、编写脚本,求100以内所有正整数之和
#!/bin/bash
#zjj
i=0 until [ $i -gt 100 ];do let sum+=i let i++ done echo $sum


4、编写脚本,通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少。
#!/bin/bash
#
i=1
NumUp=0
NumDown=0
echo
until [ $i -gt 254 ];do
if ping -W1 -c1 10.1.252.$i &>/dev/null ;then
let NumUp++
echo -e "\n\t\t 10.1.252.$i  is up  $NumUp"
else
let NumDown++
echo -e "\b\r$NumDown down"
fi
let i++
done


5、编写脚本,打印九九乘法表
#!/bin/bash
#
i=1
until [ $i -gt 9 ];do
j=1
until [ $j -gt $i ];do
echo -n -e  "${j}*${i}=$[$i*$j]\t"
let j++
done
echo
let i++
done


6、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者
#!/bin/bash
#zjj
i=1
ran=$RANDOM
max=$ran
min=$ran
echo $ran
until [ $i -gt 9 ];do
ran=$RANDOM
echo $ran
if [ $ran -gt $max ];then
max=$ran
elif [ $ran -lt $min ];then
min=$ran
fi
let i++
done
echo MAX=$max   MIN=$min


7、编写脚本,实现打印国际象棋棋盘
#!/bin/bash
#
i=1
row=1
until [ $row -gt 8 ] ;do
column=1
until [ $column -gt 8 ] ;do
i=$[$i%2]
if [ $i -eq 1 ];then
echo -ne "\033[47m  \033[0m"
else
echo -ne "\033[41m  \033[0m"
fi
let i++
let column++
done
echo
let row++
let i++
done


8、打印等腰三角形 (菱形)
#!/bin/bash
#
read -p "enter the number of line:" line
for((i=1;i<=$line;i++))
do
count=$[2*$i-1]
sapce=$[$line-$i+1]
printf "%${sapce}c" ' '
for((j=1;j<=$count;j++));do
echo -n "*"
done
echo
done
for((i=$[line-1];i>=1;i--))
do
count=$[2*$i-1]
sapce=$[$line-$i+1]
printf "%${sapce}c" ' '
for((j=1;j<=$count;j++));do
echo -n "*"
done
echo
done


9.安装centos6.7,用centos6.8kernel升级
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  for while until