更多的结构化命令

前端之家收集整理的这篇文章主要介绍了更多的结构化命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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命令输出结果的顺序。 运行这个脚本实际上说明了结果已经在脚本内部排好序了。

猜你在找的Bash相关文章