shell脚本:循环语句

shell编程基础:循环语句

标签:shell脚本

  • for循环
    又分为列表for循环、不带列表的for循环以及类C的for循环。

    • 带列表的for循环
    for VARIABLE in (list)
    do
        command
    done

    【实例】

    1. for FRUIT in apple orange banana pear
    2. #将列表定义到一个变量中,以后有任何修改只需要修改该变量即可
      fruits="apple orange banana pear"
      for FRUIT in ${fruits}
    3. for VAR in {1..5}
      for VAR in `seq 1 100`
      for VAR in $(seq 1 100)     #推荐
      
      for VAR in $(seq 1 2 100)   #利用seq命令的“步长”,计算1到100内的奇数...
    4. 列表for循环中in后面的内容可以是任意命令的标准输出。下面的例子中,会利用ls的输出作为in的列表,并循环打印所有文件的属性。

    for VAR in $(ls)
    
    do        
        ls -l $VAR
    done
    
    
    #结果
    
    -rwxr-xr-x 1 root root 49 Oct 11 10:27 test.sh
    • 不带列表的for循环

      for VARIABLE
      do
          command
      done

      使用不带列表的for循环时,需要在运行脚本时通过参数的方式给for循环传递变量值。可利用特殊变量$@改写上述结构,如下:

    [root@localhost ~]# cat for_list07.sh
    
    #!/bin/bash 
    for VARIABLE in $@
    
    do
        echo -n $VARIABLE
    done
    • 类C的for循环(注意是双括号
    for ((expression1; expression2; expression3))
    do
        command
    done

    其中,expression1、expression2、ex-pression3与C语言中的用法一致。
    【实例】
    for ((i=1; i<=10; i++))

  • while循环(注意没有分号

    while expression
    do
        command
    done
    • 使用while按行读取文件(read命令读取Linux系统上的文件,每次会读取“一行”文本)
    [root@localhost ~]# cat student_info.txt
    John    30      Boy
    Sue     28      Girl
    Wang    25      Boy
    Xu      23      Girl
    [root@localhost ~]# cat while04.sh
    
    #!/bin/bash 
    while read LINE
    do        
        NAME=`echo $LINE | awk '{print $1}'`    
        AGE=`echo $LINE | awk '{print $2}'`
        Sex=`echo $LINE | awk '{print $3}'`
        echo "My name is $NAME, I'm $AGE years old, I'm a $Sex"
    done < student_info.txt

    上面采用输入重定向的方式完成了文件读取,使用管道也可以完成同样的效果:

    [root@localhost ~]# cat while04.sh
    
    #!/bin/bash 
    cat student_info.txt | while read LINE
    do
        NAME=`echo $LINE | awk '{print $1}'`      
        AGE=`echo $LINE | awk '{print $2}'`     
        Sex=`echo $LINE | awk '{print $3}'`      
        echo "My name is $NAME, I'm $AGE years old, I'm a $Sex"
    done

    【注意】这两种方式是有细微不同的:使用重定向符的while只会产生一个Shell,而使用管道的脚本在运行时会产生3个Shell,第一个Shell是cat(由于运行速度很快所以无法使用ps命令抓到),第二个Shell是管道,第三个Shell是while。

  • until循环
      当测试结果为假时才继续执行循环体,直到测试为真时才停止循环。其语法如下(类似于do while):

    until expression
    do
        command
    done
  • select循环
      select是一种菜单扩展循环方式,其语法和带列表的for循环非常类似,基本结构如下:

    select MENU in (list)
    do
        command
    done

      当程序运行到select语句时,会自动将列表中的所有元素生成为可用1、2、3等数选择的列表,并等待用户输入。例如:

    [root@localhost ~]# cat select01.sh
    
    #!/bin/bash 
    echo "Which car do you prefer?"
    select CAR in Benz Audi VolksWagen
    do
        break #这里用到了没有讲过的break语句,这将在15.6小节中讲到
    done
    echo "You chose $CAR"
    
    
    #运行结果
    
    [root@localhost ~]# bash select01.sh
    Which car do you prefer?
    1) Benz
    2) Audi
    3) VolksWagen
    
    #? #此处尝试直接回车,结果select再次生成了列表等待输入
    
    1) Benz
    2) Audi
    3) VolksWagen
    
    #? 2
    
    
    #此处选择2,程序会退出select并继续执行后面的语句
    
    You chose Audi

    select有判断用户输入的功能,所以select经常和case语句合并使用

你可能感兴趣的:(编程,shell)