用通配符读取目录:
可以用for命令来自动遍历目录中的文件。进行此操作时必须在文件名或路径名中使用通配符。它会强制shell使用文件扩展匹配。
#!/bin/bash
#iterate through all the files in a directory
for file in /home/ZHJIAB/test/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f " $file " ]
then
echo "$file is a file "
fi
done
如果目录名中含有空格,这时候$file就要带上引号否则就会报错 too many argument
C语言风格的for命令:
bash中c语言风格的for命令:
for(( varible assignment ; condition ; iteration process))
C语言风格的for命令允许为迭代使用多个变量循环会单独处理每个变量,尽管可以使用多个变量但你只能在for循环中定义一种条件。
#!/bin/bash
# multiple variable
for (( a=1,b=10 ; a<=10 ; a++ , b-- ))
do
echo " $a - $b "
done
while命令:
while命令的基本格式是:
while test command
do
other commands
done
while命令允许在while语句行定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
#!/bin/bash
#testing a multicommand while loop
var1=10
while echo $var1
[ $var1 -ge 0 ] #-ge即为大于等于
do
echo "This is inside the loop"
var1=$[ $var1 - 1 ] #shell的算数运算操作格式为$[ ]
done
until命令:
until命令和while命令工作的方式完全相反。until命令要求你指定一个通常返回非零退出状态码的测试命令只有测试命令的退出状态码不为0,bash shell 才会执行循环中列出的命令一单测试命令返回了退出状态码0,循环就结束了。
( while循环返回退出状态码0则会继续执行循环 )
until test commands
do
other commands
done
#!/bin/bash
#using the util command
var1=100
until echo $var1
[ $var1 -eq 0 ]
do
echo Inside the loop: $var1
var1=$[ $var1 - 25 ]
done
shell会执行指定的多个测试命令,只有在最后的一个命令成立时才停止。
嵌套循环:(nestd loop)
for 嵌套 for:
#!/bin/bash
#using nestd loop
for( ( a=1 ; a<=3 ; a++ ) )
do
echo " Starting loop $a: "
for( ( b=1 ; b<=3 ; b++ ) )
do
echo " Inside loop : $b "
done
done
注意:两个循环的do和done没有任何区别,bash shell自身能够区别内部循环和外部循环。
while 嵌套 for:
#!/bin/bash
#a for loop inside a while loop
var1=5
while [ $var1 -ge 0 ]
do
echo "Outer loop: $var1 "
for ( ( var2=1 ; $var2 <3 ; var2++ ) )
do
var3 = $ [ $var1 * $var2 ]
echo " Inner loop: $var1 * $var2 = $var3 "
done
var1=$[ $var1 - 1 ]
done
同样shell能够区分for循环和while循环各自的do和done。
可以自行尝试while循环和until循环
循环处理文件数据:
通常必须遍历存储在文件中的数据,这要求结合两种技术:
1。使用嵌套循环
2。修改IFS环境变量
通过修改IFS环境变量,就能强制for命令将文件中的每行都当成单独的一个条目来处理,即便数据中有空格也是如此。一旦从文件中提取出了单独的行,可能需要再次利用循环来提取行中的数据。
典型的例子是处理/etc/passwd文件中的数据
IFS=$'\n' //使用换行符做为字段分隔符。
IFS='\n':;" //这个赋值会将反斜杠、n、冒号、分号和双引号作为字段分隔符。
IFS=$'\n':;" //这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。