在编程语言中,循环语句是最基本的语法之一,在Shell(这里是Bash)中也不例外。把相关内容整理一下吧。
这里包括for/while/until循环,以及变量自增的语法实例。
Shell(以Bash为例)中的循环语句一般有for、while、until这几种,偶尔还有写错语法的时候,这里结合实例来自己总结一下。也为今后使用提供一个快捷的资料获取渠道。
一、for循环语句
实例1.1 对目录中的文件做for循环
#!/bin/bash
for x in
/var/log/*
do
#echo "$x is a file living in /var/log"
echo $(basename $x) is a file living in
/var/log
done
注:这个$x获得的是绝对路径文件名;可以使用 “basename”
可执行程序来除去前面的路径信息。如果只引用当前工作目录中的文件(例如,如果输入 “for x in
*”),则产生的文件列表将没有路径信息的前缀。
实例1.2 对位置参数做for循环
#!/bin/bash
for thing in
"$@"
do
echo you typed ${thing}.
done
实例1.3 for循环中用seq产生循环次数,加上C语言形式的for循环语句
#!/bin/bash
echo "for: Traditional form:
for var in …"
for j in $(seq 1 5)
do
echo
$j
done
echo "for: C language form: for (( exp1; exp2; exp3
))"
for (( i=1; i<=5; i++ ))
do
echo "i=$i"
done
二、while循环语句
实例2.1 循环输出1到10的数字
复制代码 代码如下:
#!/bin/bash
myvar=1
while [ $myvar
-le 10 ]
do
echo $myvar
myvar=$(( $myvar + 1
))
done
只要特定条件为真,”while” 语句就会执行
三、until循环语句
实例3.1 循环输出1到10的数字
“Until” 语句提供了与
“while” 语句相反的功能:只要特定条件为假,它们就重复。下面是一个与前面的 “while” 循环具有同等功能的 “until” 循环。
复制代码 代码如下:
#!/bin/bash
myvar=1
until [ $myvar
-gt 10 ]
do
echo $myvar
myvar=$(( $myvar + 1
))
done
Linux
Shell中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法。
我所知道的,bash中,变量自增,目前有五种方法:
1.
i=`expr $i + 1`;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i
+ 1 ))
可以实践一下,简单的实例如下:
#!/bin/bash i=0;while [ $i -lt 4 ];do echo $i; i=`expr $i + 1`; # let i+=1; # ((i++)); # i=$[$i+1]; # i=$(( $i + 1 ))done
课后作业:
1.求100以内所有正整数之和
2.编写脚本,通过ping命令探测10.1.252.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少。
结果:
#!/bin/bash ip=1 up=0 down=0 ipv4=10.1.252 until [ $n -gt 255 ] do IP="$ipv4"."$n" #for ipv in {0..255} ;do # IP="$ipv4"."$ipv" let n++ ping "$IP" -c 1 -W 1 &>/dev/null && echo "The Up IPv4 is:$IP" && let up+=1 &>/dev/null || let down+=1 &>/dev/null done echo "IPv4($ipv4.1-255) up is :$up" echo "IPv4($ipv4.1-255) down is :$down"
3.编写脚本,打印九九乘法表
代码:
#/bin/bash i=1 j=1 until (($i>=10)) do j=1 until (($j>$i)) do sum=$[ $j*$i ] echo -ne "$i*$j=$sum \t" if [ $i == $j ] ;then echo -en "\n" fi let j++ done let i++ done
4.编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者
#!/bin/bash i=0 while (( i<10 ));do array[$i]=$((RANDOM%100)) echo -n " ${array[$i]}" let i++ done echo max=${array[0]} for j in `seq 1 9`;do if [ $max -lt ${array[$j]} ];then max=${array[$j]} else fi done echo $ma
x
5.编写脚本,实现打印国际象棋棋盘
~
#!/bin/bash let i=0 let j=0 for ((i=0; i < 8; i++));do echo -n $i for((j=0; j < 8; j++));do if [ $[$[$i+$j]%2] -eq 0 ];then echo -en "\033[43m \033[0m" else echo -en "\033[42m \033[0m" fi done echo done echo -e " " {A..H} ~
~
6.打印等腰三角形
#!/bin/bash for i in `seq 1 2 10`;do k=1 while [ $k -le $((10-$(($i+1))/2)) ];do echo -ne " " let k++ done for j in `seq 1 $i`;do echo -n "*" done echo done #!/bin/bash i=1 while [ $i -le 10 ] ; do j=1 while [ $j -le $((10-$i)) ] ; do echo -n ' ' j=$(($j+1)) done j=1 while [ $j -le $((2*$i-1)) ] ; do echo -n x j=$(($j+1)) done echo i=$(($i+1))
7.猜数字游戏
#!/bin/bash s=0 I=3 while (( $s == 0 ));do var=$((RANDOM%11)) echo "welcome! you will have three times to guess a number in range 0 to 10!" while (( $I != 0 ));do read -p " please input you guess number:" guess if [ $guess-ge 0 ] &> /dev/null;then if [ $guess -lt $var ];then echo "you guess number is too little, you have $[$I-1] time to try " elif [ $guess -gt $var ];then echo " you gues number is too large, you have $[$I-1] time to try" elif [ $guess -eq $var ];then echo -e "\033[32moh,great! you are win\033[0m" read -p "do you want to continue ?, anykey to continue ,n to quit :" c if [ $c == n ];then echo "you have quit game,goodbye!" exit else echo "you will comtinue , good luck to yoiu" s=0 I=3 continue 3 fi fi else echo " you input is wrong,please again" continue fi let I-- done if [ $I==0 ];then echo -e "\033[31moh,sorry,you lose!\033[0m" fi read -p "do you want to continue ?, anykey to continue ,n to quit :" c if [ $c == n ];then echo "you have quit game,goodbye!" s=1 else echo "you will comtinue , good luck to yoiu" s=0 I=3 fi done
原创文章,作者:zsyzgw,如若转载,请注明出处:http://www.178linux.com/37050