内容纲要
3.1 for命令
for var in list
do
commands
done
也可以将do 语句和 for 语句放在同一行,但必须用分号将其同列表中的值分 开:
for var in list; do
3.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
- 从变量读取列表
list="Alabama Alaska Arizona"
for test in $list
do
echo "word:$test"
done
- 从命令读取值
file="states"
for state in $(cat $file)
do
echo "Visit beautiful $state"
done
- 用通配符读取目录
#!/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]