更多的结构化命令

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值