`
mars914
  • 浏览: 429880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Shell for 循环应用

阅读更多

for 循环 


  在介绍for循环之前,我们要学个非常有用的unix命令:shift

我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当Shell程序不知道其个数时,可以把所有参数一起赋值给变量$*。

若用户要求Shell在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在$1后为$2,在$2后面为$3等。在 shift命令执行前变量$1的值在shift命令执行后就不可用了。  
示例如下:  

#测试shift命令(x_shift.sh)  

until [ $# -eq 0 ]  

do 
    echo "第一个参数为: $1 参数个数为: $#"  

    shift  

done  

 
执行以上程序x_shift.sh: 

 $./x_shift.sh 1 2 3 4  
结果显示如下:  
第一个参数为: 1 参数个数为: 3  

第一个参数为: 2 参数个数为: 2  

第一个参数为: 3 参数个数为: 1  

第一个参数为: 4 参数个数为: 0  


从上可知shift命令每执行一次,变量的个数($#)减一,而变量值提前一位,下面代码用until和shift命令计算所有命令行参数的和。 

#shift上档命令的应用(x_shift2.sh) 

if [ $# -eq 0 ]  

then 
    echo "Usage:x_shift2.sh 参数"  

    exit 1  

fi  

sum=0  

until [ $# -eq 0 ]  

do 
    sum=`expr $sum + $1`  

    shift  

done 
echo "sum is: $sum"   

 
执行上述程序:
QUOTE:
$x_shift2.sh 10 20 15 
其显示结果为:   45  


  shift命令还有另外一个重要用途,Bsh定义了9个位置变量,从$1到$9,这并不意味着用户在命令行只能使用9个参数,借助shift命令可以访问多于9个的参数。  
  Shift命令一次移动参数的个数由其所带的参数指定。例如当shell程序处理完前九个命令行参数后,可以使用shift 9命令把$10移到$1。  
  在熟悉了shift命令后,我们一起看看,Bsh程序中非常有用的for循环语句,这种循环同上面说的while和until循环不同,for语句中的循环是否执行并不由某个条件的真和假来决定,决定for循环是否继续的条件是参数表中是否还有未处理的参数。 
For语句的结构如下:
QUOTE:
for variable in arg1 arg2 … argn  

do  

    command  

    command  

    … …  

done 
下面是for循环的简单例子:  
for LETTER in a b c d  

do 
    echo $LETTER  

done  
程序执行结果如下:   a  b  c  d  
在上面计算参数和的例子中,我们可以用for循环,实现如下:  
#测试 for 程序(x_for.sh)
QUOTE:

 

if [ $# -eq 0 ]  
then 
   echo "Usage:x_for.sh 参数… …"     
   exit 1  
fi  

sum=0  
for I in $*  
do 
   sum=`expr $sum + $I`  
done 
echo "sum is: $sum" 

 
中断循环指令  
  在程序循环语句中,我们有时候希望遇到某中情况时候结束本次循环执行下次循环或结束这个循环,这就涉及到两条语句:continue和break。

  continue命令可使程序忽略其后循环体中的其他指令,直接进行下次循环,而break命令则立刻结束循环,执行循环体后面的的语句。  

#测试continue  
I=1 
while [ $I -lt 10 ]  
do 
  if [ $I -eq 3 ]    
  then      
    continue    
  fi 
  if [ $I -eq 7 ]    
  then      
    break 
  fi    
  echo "$Ic"  
done   

 
执行上面程序,结果如下:  
12456789

  
与或结构  
使用与/或结构有条件的执行命令  
  Shell程序中可以使用多种不同的方法完成相同的功能,例如until和while语句就可以完成相同的功能,同样,除了if-then-else结构可以使命令有条件的执行外,$$和||操作符也能完成上述功能。

在C语言中这两个操作符分别表示逻辑与和逻辑或操作。

在Bourne Shell中,用&&连接两条命令的含义只有前面一条命令成功执行了,后面的命令才会执行。  
  &&操作的形式为:  
    command && command  
  例如语句:  
    
QUOTE:
rm $TEMPDIR/* && echo "Files successfully removed" 
  只有rm命令成功执行以后,才会执行echo命令。若用if-then语句实现上述功能,形式为:  
if rm $TEMPDIR/* 
then 
      echo "Files successfully removed"      

fi 
 

 相反,用||连接两条命令的含义为只有第一条命令执行失败才执行第二条命令,例如:  
    rm $TEMPDIR/* || echo "File were not removed"  
  上面语句的等价形式为:  
if rm $TEMPDIR/*      

then        

    :      

else 
      echo "Files were not removed"      

fi 
  这两种操作符可以联合使用,如下命令行中,只有command1和command2执行成功后,command3才会执行:  
    command1 && command2 && command3  


  下面的命令行表示只有command1成功执行,command2不成功执行时,才会执行command3。

  
  &&和||操作符可以简化命令条件执行的格式,但一般只用于一条命令的条件执行。如果许多命令都使用这两个操作符,那么整个程序的可读性将变的很差,所以在多条命令的条件执行时,最好采用可读性好的if语句。   函数  
  现在我们介绍Shell程序中的函数部分,基本上任何高级语言都支持函数这个东西,能让我们胜好多事情的东西,至少省的频繁的敲击相同的东西.

 
Shell程序中的函数  
  函数又叫做子程序,可以在程序中的任何地方被调用,其格式如下:  
  函数名字()    { 
    command      ... ...      command;    }  


  Shell程序的任何地方都可以用命令 "函数名字" 调用,使用函数的好处有两点,一点是使用函数可以把一个复杂的程序化为多个模块,易于管理,符合结构化程序的设计思想,另一个好处是代码的重用。 
Shell函数和Shel程序比较相似,它们的区别在于Shell程序在子Shell中运行,而Shell函数在当前Shell中运行。因此,在当前Shell中可以看到Shell函数对变量的修改。在任何Shell中都可以定义函数,包括交互式Shell。  
  例如:  
    $dir() {ls -l;}  
    结果是我们在$后面打dir,其显示结果同ls -l的作用是相同的。该dir函数将一直保留到用户从系统退出,或执行了如下所示的unset命令:      $unset dir 
    下面的例子说明了函数还可以接受位置参数:  
    $dir(){_ 
    >echo "permission    ln owner   group    file sz last access      >ls -l $*;      >}  
    运行 dir a* 看产生什么结果  
    参数a*传递到dir函数中并且代替了$*  
    通常Shell程序将在子Shell中执行,该程序对变量的改变只在子Shell中有效而在当前Shell中无效。"."命令可以使Shell程序在当前Shell中执行。用户可以在当前Shell中定义函数和对变量赋值。通常用下面命令来重新初使化.profile对Shell环境的设置。      $ . .profile 
  由于看到这部分相对简单,我们还是顺便说说trap好了 
 

分享到:
评论

相关推荐

    shell for循环与数组应用介绍

    读取一个文件,把每一行赋值给一个数组的变量,然后用for循环打印出来 代码如下:#!/bin/shi=1SUM=`sed -n ‘$=’ tmp.txt` #计算文件的总行数echo “$SUM”while read linedo arr[$i]=”$line” i=`expr $i + 1`...

    Shell两种for循环对应实现方法解析

     生产环境中的应用场景:根目录下建立数量不等的目录,挂载不同的硬盘,按sdb-sdn的顺序对应/data2-/datan,就需要for循环嵌套来解决,写成如for i in 1 2 3 ,for j in a b c,1a,2b,3c这样而for循环似乎并不...

    Shell脚本常识--(循环控制)

    了解并掌握shell中的while循环和for循环的语法格式及其应用。

    shell 编程指南pdf

    18.5.5 使用for循环连接服务器 183 18.5.6 使用for循环备份文件 183 18.5.7 多文件转换 183 18.5.8 多sed删除操作 184 18.5.9 循环计数 184 18.5.10 for循环和本地文档 184 18.5.11 for循环嵌入 185 18.6 until循环 ...

    Linux下Shell从入门到精通完整版视频.zip

    6.For循环及实战批量远程命令脚本.mp4 7.While条件语句企业案例列表读取_0.mp4 8.Shell编程之Case语句及Select综合应用_0.mp4 9.Shell编程之函数及案例分析.mp4 10.Linux下深入编程之函数及数组编程.mp4 11.Shell...

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。《跟老男孩学Linux运维:...

    LINUX与UNIX SHELL编程指南(很全)

    18.5.5 使用for循环连接服务器 183 18.5.6 使用for循环备份文件 183 18.5.7 多文件转换 183 18.5.8 多sed删除操作 184 18.5.9 循环计数 184 18.5.10 for循环和本地文档 184 18.5.11 for循环嵌入 185 18.6 until循环 ...

    跟老男孩学Linux运维:Shell编程实战 part3

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

    绝版经典《Linux与UNIX Shell编程指南》

    18.5.5 使用for循环连接服务器 183 18.5.6 使用for循环备份文件 183 18.5.7 多文件转换 183 18.5.8 多sed删除操作 184 18.5.9 循环计数 184 18.5.10 for循环和本地文档 184 18.5.11 for循环嵌入 185 18.6 until循环 ...

    跟老男孩学Linux运维:Shell编程实战.part2

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

    跟老男孩学Linux运维:Shell编程实战.part1

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

    shell教程-30章,下了之后会让你大吃一惊,相当好

    18.5.5 使用for循环连接服务器 183 18.5.6 使用for循环备份文件 183 18.5.7 多文件转换 183 18.5.8 多sed删除操作 184 18.5.9 循环计数 184 18.5.10 for循环和本地文档 184 18.5.11 for循环嵌入 185 18.6 until循环 ...

    LINUX与UNIX SHELL编程指南 高清PDF

    18.5.5 使用for循环连接服务器 183 18.5.6 使用for循环备份文件 183 18.5.7 多文件转换 183 18.5.8 多sed删除操作 184 18.5.9 循环计数 184 18.5.10 for循环和本地文档 184 18.5.11 for循环嵌入 185 18.6 until循环 ...

    Linux与Unix Shell编程指南(PDF格式,共30章)

    18.5.5 使用for循环连接服务器 183 18.5.6 使用for循环备份文件 183 18.5.7 多文件转换 183 18.5.8 多sed删除操作 184 18.5.9 循环计数 184 18.5.10 for循环和本地文档 184 18.5.11 for循环嵌入 185 18.6 until循环 ...

    跟老男孩学Linux运维:Shell编程实战 part5

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

    跟老男孩学Linux运维:Shell编程实战 part1

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

    跟老男孩学Linux运维:Shell编程实战 part4

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

    跟老男孩学Linux运维:Shell编程实战 part2

    第三部分为第9章~第13章,着重讲解case条件语句、while循环和until型循环、for循环和select循环、条件与循环控制及程序返回值、Shell数组等知识。第四部分为第14章~第16章,着重讲解Shell脚本开发规范与编码习惯、...

Global site tag (gtag.js) - Google Analytics