• 使用 for 循环遍历命令的执行结果

    • for 循环的语法

      for 参数 in 列表
      
      do 执行的命令
      
      done 封闭一个循环
      
    • 使用反引号或 $() 方式执行命令,命名的结果当作列表进行处理

  • 使用 for 循环遍历变量和文件的内容

    • 列表中包含多个变量,变量用空格分隔
      • eg:产生一个列表:echo {1..9}
    • 对文本处理,要使用文本查看命令取出文本内容
      • 默认逐行处理,如果文本出现空格会当作多行处理

    Eg:

    touch a.mp3 b.mp3 c.mp3
    for filename in `ls *.mp3`
    do
    	mv $flename $(basename $filename .mp3).mp4
    done
    
  • C语言风格的 for 命令

    for(( 变量初始化 ; 循环判断条件 ; 变量变化 ))
    do
    	循环执行的命令
    done
    

    eg:

    for (( i=1 ; i<= 10; i++ ))
    do  
    	echo $i
    done
    
  • while 循环

    while test测试条件是否成立
    do
    	命令
    done
    

    eg:

    a=1
    while [ $a -lt 10 ]
    do
       echo $a
    	((a++))
    done
    
  • 死循环

    while test测试一直成立
    do
    	命令
    done
    

    eg:

    while :
    do
      echo always
    done
    
  • until 循环

    • until 循环与 while 循环相反,循环测试为假时,执行循环,为真时循环停止
    • eg:
    a=1
    until [ $a -gt 6 ]
    do
      echo $a
      ((a++))
    done
    
  • 循环的使用

    • 循环和循环可以嵌套

    • 循环中可以嵌套判断,反过来也可以嵌套

      eg:

      for sc_name in /etc/profile.d/*.sh
      do
        if [ -x $sc_name ] ;then
      	   echo $sc_name
        fi
      done
      
    • 循环可以使用break和continue语句在循环中退出

      eg:

      for num in {1..9}
      do
      	if [ $num -eq 5 ] ;then
      		break
      	fi
      	echo $num
      done
      
  • break 和 continue 语句

    • break
    for num in {1..9}
    do
    	if [ $num -eq 5 ] ;then
    		break
    	fi
    	echo $num
    done
    
    • continue
    for num in {1..9}
    do
    	if [ $num -eq 5 ] ;then
    		break
    	fi
    	echo $num
    done
    
  • 使用循环对命令行参数的处理

    • 命令刚参数可以使用 $1 $2 .. ${10} .. ${n} 进行读取

    • $0 代表脚本名称

    • $* 和 $@ 代表所有位置参数

    • $# 代表位置参数的数量

      • eg1:
      for pos in $*
      do
        if [ "$pos" = "help" ]; then
            echo $pos $pos
        fi
      done
      
    • shift 参数左移

      while [ $# -ge 1 ] 
      do
          if [ "$1" = "help" ]; then
              echo $1 $1
          fi  
          shift
      done