HomeLINUXshell脚本-结构化命令-循环

shell脚本-结构化命令-循环

内容纲要

3.1 for命令

for var in list
do 
    commands
done

也可以将do 语句和 for 语句放在同一行,但必须用分号将其同列表中的值分 开: 
for var in list; do

3.1.1 制定列表中的值的几种不同的方式:

  1. for命令自身所定义的一系列的值
eg:
#!/bin/bash
#
#单引号的处理
#有两种办法可解决这个问题:
#使用转义字符(反斜线)来将单引号转义; 
#使用双引号来定义用到单引号的值。
for test in I don\'t konw if this\'ll work
do
    echo "word:$test"
done

for test in I "don't" konw if "this'll" work
do
    echo "word:$test"
done

#空格的处理
#用双引号圈起来
for test in Nevada "New Hampshire" "New Mexico" "New York" 
do 
    echo "Now going to $test" 
done

#双引号处理
#shell 并不会将双引号当成值的一部分
for test in my name is "Tim"
do
    echo "word:$test"
done
  1. 从变量读取列表
list="Alabama Alaska Arizona"
for test in $list
do
    echo "word:$test"
done
  1. 从命令读取值
file="states"

for state in $(cat $file) 
do 
    echo "Visit beautiful $state" 
done
  1. 用通配符读取目录
#!/bin/bash

#代码用test命令测试了每个条目(使 用方括号方法),以查看它是目录(通过-d参数)还是文件(通过-f参数)
#在Linux中,目录名和文件名中包含空格当然是合法的。要适应这种情况,应该将$file变 量用双引号圈起来。如果不这么做,遇到含有空格的目录名或文件名时就会有错误产生。
for file in /home/wwwroot/shell/*
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f "$file" ]
    then
        echo "$file is a file"
    fi
done
  • 关于循环内部变量值的作用域:在最后一次迭代后,内部变量的值会在shell脚本剩余部分一直保持(除非被修改)与其他语言有区别
#!/bin/bash
for var in A B C D E 
do
    echo $var
done

echo "the var value is $var"

#code resutl:
A
B
C
D
E
the var value is E

3.1.2 更改字段分隔符 IFS

默认情况下,bash shell会将下列字 符当作字段分隔符:

  • 空格
  • 制表符
  • 换行符
    可以在shell脚本中临时更改IFS环境变量的值来限制被bash shell当作字段 分隔符的字符

    IFS=$'\n' #改成换行符
    IFS=:     #冒号
    IFS=$'\n':;"  #将换行符、冒号、分号和双引号作为字段分隔符

    一个可参考的安全实践是在改变 IFS 之前保存原 来的 IFS 值,之后再恢复它。
    这种技术可以这样实现:

    IFS.OLD=$IFS 
    IFS=$'\n'   #在代码中使用新的IFS值
    IFS=$IFS.OLD

    这就保证了在脚本的后续操作中使用的是 IFS 的默认值。


3.1.3 C语言风格的for命令

for (( variable assignment ; condition ; iteration process ))

注意,有些部分并没有遵循bash shell标准的for命令:

  • 变量赋值可以有空格; 
  • 条件中的变量不以美元符开头; 
  • 迭代过程的算式未用expr命令格式。
#!/bin/bash

#example001
for (( i = 0; i < 10; i++ )); do
    echo $i
done

#example002
for (( i = 0; i < 10; i++ ))
do
    echo $i
done

#example003
#多个变量
#循环会单独处理每个变量,你可以为每 个变量定义不同的迭代过程。尽管可以使用多个变量,但你只能在for循环中定义一种条件
for (( i = 0,j=10; i < 10; i++,j-- ))
do
    echo "$i - $j"
done

3.2 while命令

while test command 
do 
    other commands 
done
  • while命令允许定义一个要测试 的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码0。
  • 它会在每次迭代的 一开始测试test命令。在test命令返回非零退出状态码时,while命令会停止执行那组命令
  • while命令允许你在while语句行定义多个测试命令。只有最后一个测试命令的退出状态码 会被用来决定什么时候结束循环
  • 在含有多个命令的while语句中,在每次迭代中所有的测试命令都会被执行,包括测 试命令失败的最后一次迭代。要留心这种用法。另一处要留意的是该如何指定多个测试命令。注 意,每个测试命令都出现在单独的一行上
    var1=10
    while echo $var1 
        [ $var1 -ge 0 ] 
    do
    echo "This is inside the loop"
    var1=$[ $var1 - 1 ] 
    done

    3.3 until命令

    until命令和while命令工作的方式完全相反。until命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为0,bash shell才会执行循环中列出的命令。 一旦测试命令返回了退出状态码0,循环就结束了。

    until test commands 
    do
    other commands 
    done

    和while命令类似,你可以在until命令语句中放入多个测试命令。只有最后一个命令的退出状态码决定了bash shell是否执行已定义的other commands。

    var1=100
    until [ $var1 -eq 0 ] 
    do
    echo $var1
    var1=$[ $var1 - 25 ] 
    done

    3.4 控制循环

    break命令
    continue命令

    3.4.1 break命令

    break 命令是退出循环的一个简单方法。 可以用 break命令来退出任意类型的循环, 包括 while和until循环。

    break n

    其中n指定了要跳出的循环层级。默认情况下,n为1,表明跳出的是当前的循环。如果你将 n设为2,break命令就会停止下一级的外部循环。

3.4.2 continue命令

continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。
和break命令一样,continue命令也允许通过命令行参数指定要继续执行哪一级循环:

continue n

其中n定义了要继续的循环层级。


3.5 处理循环的输出

,在shell脚本中,你可以对循环的输出使用管道或进行重定向。这可以通过在done命令 之后添加一个处理命令来实现。

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

3.6 实例:创建多个用户账户

input="users.csv" 
while IFS=',' read -r userid name 
do
    echo "adding $userid"
    useradd -c "$name" -m $userid 
done < "$input"

$ cat users.csv 
rich,Richard Blum 
christine,Christine Bresnahan 
barbara,Barbara Blum 
tim,Timothy Bresnahan

[[转载请注明出处:
斜杠猿:http://www.80soho.com/?p=969]

打赏
发表评论

电子邮件地址不会被公开。