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_OLD=$IFS IFS="\n" <some code> IFS=IFS_OLD
C语言风格的for命令
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
控制循环
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
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命令输出结果的顺序。 运行这个脚本实际上说明了结果已经在脚本内部排好序了。