Skip to content

Latest commit

 

History

History
146 lines (134 loc) · 3.98 KB

File metadata and controls

146 lines (134 loc) · 3.98 KB

循环

for循环

格式:
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循环

格式:
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

格式:
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……