更多的结构化命令

for命令

格式:

for var in list
do
    commands
done

1. 读取列表中的值

读取for命令自身中定义的一系列值:

for test in Mess1 Mess2 Mess3
do
    echo The next stat is $test
done

# the output will be:
the next stat is Mess1
the next stat is Mess2
...

2. 读取列表中的复杂值

  • 如果数据中有单引号:
    eg:

    for test in I don't know if this'll work
    do
      echo $test
    done

    如果想输出 I,don’t,know,if,this’ll,work
    则正确的写法应该是:

    for test in I don\'t know if this\'ll work

    使用转义字符(反斜杠)来将单引号转义;

    或者:

    for test in I "don't" know if "this'll" work

    使用双引号(”“)来定义用到单引号的值。

  • 如果数据中有空格的话,则也要用双引号(”“)来将这些值圈起来。因为for循环假定每个值都是用空格分割的。

3. 从变量读取列表

list="hi1 hi2 hi3"
list=$list" hi4"      #向list尾部添加文本
for test in $list

4. 从命令读取值

即:使用反引号来执行任何能产生输出的命令,然后在for命令中使用该命令的输出:

for state in `cat $file`

字段分隔符

Linux中有一个特殊的环境变量IFS,称为内部字段分隔符:它定义了bash shell用作字段分隔符的一系列字符。

默认情况下 IFS的值为:

  • 空格
  • 制表符
  • 换行符

我们可以修改IFS的值来修改字段分隔符。

IFS_OLD=$IFS
IFS="\n"
<some code>
IFS=IFS_OLD

C语言风格的for命令

  1. C语言的for命令

    for (( variable assignment ; condition ; iteration process ))
    #!/bin/bash 
    #testing the C style for loop
    
    
    #使用单个变量
    
    for (( i=1; i <= 10; i++ ))
    do
        echo "the next number is $i"
    done
    #!/bin/bash 
    #使用多个变量,当有多个变量时,只能在for循环中定义一种条件;
    
    for (( a=1,b=10; a<= 10; a++,b-- ))
    do
       echo "$a - $b"
    done

while命令

格式:

while test command
do
    other commands
done
#!/bin/bash
     # 使用多个测试命令
     # 在每次迭代中,所有的测试命令都会执行;
     # 每个测试命令都在单独的一行上
     var1=10
     while echo $var1
           [ $var1 -ge 0 ]
     do 
         echo "this is inside the loop"
     done

until 语句

格式:

until test commands
do
    other commands
done

类似于while语句,可以在until命令中有多个测试命令

#!/bin/bash
    var1=100
    until echo $var1
          [ $var1 -eq 0 ]
    do
        echo Inside the loop: $var1
        var1=$[ $var1 - 25 ]
    done

嵌套循环

#!/bin/bash
for (( a=1; a<=3; a++ ))
do
    echo "starting loop $a:"
    for (( b=1; b<=3; b++ ))
    do
        echo "Inside loop: $b"
    done
done

循环处理文件数据

处理/etc/passwd文件中的数据:

#!/bin/bash
# change the IFS value
IFS.OLD=$IFS
IFS="\n"
for entry in `cat /etc/passwd`
do
    echo "values in $entry -"
    IFS=:
    for value in $entry
    do 
        echo " $value"
    done
done

控制循环

  1. break命令

    • 跳出单个循环
    • 跳出内部循环
    • 跳出外部循环

      break n

      有时你在内部循环,但需要停止外部循环。可使用上面的命令:其中n为要跳出的循环层数。
      默认情况下,n为1,表明跳出的是当前的循环。如果你将n设为2,break命令就会停止上一级的外部的循环。

      #/bin/bash
          #跳出外部循环,即跳出a部分循环
          for (( a=1; a<4; a++ ))
          do
              echo "Outer loop: $a"
              for (( b=1; b<100; b++ ))
              do
                  if [ $b -gt 4 ]
                  then
                      break 2
                  fi
                  echo " Inner loop: $b"
              done
          done
  2. continue命令

    • 基本的continue用法
    • 参数n指定继续哪级循环

      continue n

      n指定了要继续的循环层数。

处理循环的输出

在shell脚本中,你要么管接要么重定向循环的输出。
可以在done命令之后添加一个处理命令:

for file in /home/*
do
    if [ -d "$file" ]
    then
        echo "$file is a file."
    fi
done > output.txt

shell会将结果重定向到文件output.txt中,而不是显示在屏幕上。

同样,可以将循环的结果管接给另一个命令:

脚本 test2.sh:

运行结果:

可以看出,for命令的输出传给了sort命令,他会改变for命令输出结果的顺序。 运行这个脚本实际上说明了结果已经在脚本内部排好序了。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...