格式:
for var in list
do
commands
done
例子:
#!/bin/bash
# another example of how not to use the for command
for test in I don\'t know if "this'll" work
do
echo "word:$test"
done
输出:
word:I
word:don't
word:know
word:if
word:this'll
word:work
因为shell看到了列表值中的单引号并尝试使用它们来定义一个单独的数据值,所以我们用转义字符来将单引号转义。或者用双引号来定义用到单引号的值。
上面这个例子,判断list
的分隔符是空格,那么想要其他分隔符咋办?可以使用bash shell
已经为我们准备好的内部字段分隔符。也就是环境变量IFS
。
默认情况下,bash shell会将下列字 符当作字段分隔符:
- 空格
- 制表符
- 换行符
比如我们想用换行符当分隔符,可以这么做。IFS=$'\n'
在处理代码量较大的脚本时,可能在一个地方需要修改IFS的值,然后忽略这次修改,在 脚本的其他地方继续沿用IFS的默认值。一个可参考的安全实践是在改变IFS之前保存原 来的IFS值,之后再恢复它。 这种技术可以这样实现:
IFS.OLD=$IFS
IFS=$'\n'
<在代码中使用新的IFS值>
IFS=$IFS.OLD
这就保证了在脚本的后续操作中使用的是IFS的默认值。
用for循环遍历目录中的文件用到了通配符。
for file in /home/rich/test/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
在Linux中,目录名和文件名中包含空格当然是合法的。。要适应这种情况,应该将$file变 量用双引号圈起来。如果不这么做,遇到含有空格的目录名或文件名时就会有错误产生。
C语言风格的for循环
for (( i=1; i <= 10; i++ ))
do
echo "The next number is $i"
done
格式:
while test command
do
other command
done
例子:
var1=10
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[ $var1 - 1 ]
done
输出:
10 9 8 7 6 5 4 3 2 1
只要测试条件成立,while命令就会不停地循环执行定义好的命令。
格式:
until test command
do
other commands
done
例子:
var1=100
until [ $var1 -eq 0 ]
do
echo $var1
var1=$[ $var1 - 25 ]
done
输出:
100 75 50 25
until命令和while命令工作的方式完全相反。until命令要求你指定一个通常返回非零退 出状态码的测试命令。只有测试命令的退出状态码不为0,bash shell才会执行循环中列出的命令。 一旦测试命令返回了退出状态码0,循环就结束了。
这么多循环,根据需求,随意嵌套。
循环处理文件数据,通常需要两种技术:嵌套循环和修改IFS环境变量。
例子:
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
输出:
Values in katie:x:502:502:Katie Blum:/home/katie:/bin/bash -
katie
x
506
509
Katie Blum
/home/katie
/bin/bash
shell也能够控制循环,用break和continue。
break命令接受单个命令行参数值: break n
。默认情况下,n为1,表明跳出的是当前的循环。如果你将 n设为2,break命令就会停止下一级的外部循环。
continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。可以在循环 内部设置shell不执行命令的条件。
不希望循环输出出现在屏幕上,而是在某个文件里,可以用之前学过的重定向输出。
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
To be continue……