Shell中的循环语句

在编程语言中,循环语句是最基本的语法之一,在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以内所有正整数之和

blob.png

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}
~

blob.png                                                                       

~                                                                                                                                                                                              

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

(0)
zsyzgwzsyzgw
上一篇 2016-08-22 09:29
下一篇 2016-08-22 09:29

相关推荐

  • 第六周作业-练习题sed,crontab,bash

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#;    方法一用sed:          方法二用vim       &…

    Linux干货 2017-01-16
  • linux 目录结构

    该文章主要来自于网络资料进行整理 目录结构参考地址: http://www.iteye.com/topic/1125162 http://yangrong.blog.51cto.com/6945369/1288072 http://itlab.idcquan.com/linux/administer/939529_1.html http://itlab.id…

    系统运维 2015-12-19
  • find和grep命令练习

                                    find和grep命令练习 1、显示当前系统上root,fedora,或user1用户的默认shell; ~]# cat /etc/pa…

    Linux干货 2016-10-23
  • Linux用户和组管理

      用户和组管理类命令的使用方法 Liunx用户组管理命令: groupadd命令:添加组     命令用法:         groupadd [选项] group_name   &nbs…

    Linux干货 2016-11-25
  • PHP安全模式详解(PHP5.4安全模式将消失)

    1. 安全模式      一直没有用过php的safe_mode安全模式,以此说明作为日后参考。      PHP 的安全模式是为了试图解决共享服务器(shared-server)安全问题而设立的。在结构上,试图在 PHP 层上解决这个问题是不合理的,但修改 web 服务器层和操作系统层显得非常不现…

    Linux干货 2015-06-02
  • 关于软硬链接那些事儿

           小编这周接触到了链接,那么重点来了,啥是链接呢小编觉得链接简单来说就是一种共享的方式,比如我们去逛超市,超市的入口就是‘链接’。在Linux中,链接又分为软连接和硬链接,想要了解他俩,就得先了解几个基本概念。 一:Inode       我们知道文件包含数据和元数据,它的数据…

    Linux干货 2017-07-22