Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92284426
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 22:54:58

 

一、     流程控制

1、for 语句

for语句是一个循环语句,其循环的次数由实参表中的参数个数决定,每

次循环都执行一遍关键字dodone之间的语句。

 

    语法为:                        流程图如下:

                                        |         没有了

    for 变量名 in 实参表    |----<实参中还有东西吗?>---|

    do                      |           |            |

       命令序列             |     从实参表中取得一     |

    done                    |      项放到变量中        |

                            |           |              |

                            |       执行命令序列       |

                            |           |     |--------|

                            |-----------|     |        

     例题1                                  |

           for a in xx yy zz

           do

echo $a

           done

结果如下:

     xx   (第一个循环变量a被赋值xx,由echo $a将其值显示出xx

     yy   (第一个循环变量a被赋值yy,由echo $a将其值显示出yy

     xx   (第一个循环变量a被赋值zz,由echo $a将其值显示出zz

当实参表中没有可用赋值的参数时,循环就结束了。

 

         例题2:将当前目录下的文件名都加上一个后缀.txt

           for file in `lf`

           do

mv $file $file.txt

           done

 

2、while 语句

while 语句也是一个循环语句,它的循环次数由测试语句的返回值来决

定,除非返回值为假,否则while语句将一便又一便地反复执行关键字do

done之间的语句。

 

   语法:                              流程图

                                         |      

  while [ 判断语句 ]          |———<判断语句> ———|

  do                          |          |          |

     命令序列                 |—————|            |

  done                                                |

                                              |—————-|

                                              |

例题:

    number=0

    while [ $number –lt 10 ]

    do

        echo “$number\c”

        number=`expr $number + 1`

    done

结果:0123456789

 

3、if 语句

if 是非循环语句,但也不是严格意义上的顺序执行语句,它对状态进行

判断,当且仅当测试语句的返回值为真时才执行关键字then后面的语句。

 

   语法:                              流程图

                                         |     

   if [ 判断语句 ]                   <判断语句>——|

   then                                  |       |

       命令序列                       命令序列     |

   fi                                    |————-|

                                             |        

  例题:文件名为chk

      if [ $# != 0 ]

      then

          echo “Arg1:$1”

      fi

   执行 chk Hello

   结果: Arg1:Hello

 

4、if then else 语句

if 语句的加强,此语句当且仅当测试语句的返回值为真时去执行关

键字then后面的命令,否则便执行关键字else后面的命令。

 

   语法:                                 流程图                           

                                             |     

   if [ 判断语句 ]                      <判断语句>——|

then                                     |       |                                

      命令序列1                      命令序列1   命令序列2

else                                     |         |

      命令序列2                          |————|                      

fi

 

例题:if [ $a –le 10 ]

      then

          echo”little”

     else

           echo “large”

     fi

 

5、if then elif 语句

if语句的嵌套形式,即一个if语句中再嵌套另一个if语句。

 

语法:                         流程图

                                 |                                 

if [ 判断语句1 ]            <判断语句1>——|

then                             |        |        

命令序列1              命令序列1 <判断语句2>——|

elif [ 判断语句 ]                |         |         |     

then                             |      命令序列2  命令序列 3

      命令序列 2                 |————-|—————-|

else                             |

      命令序列3

fi

 

例题:输入三个数,显示它们的相等情况

  read word1 word2 word3

  if [ $word1=$word2 –a $word2=$word3 ]

  then

    echo “word1=word2=word3”

  elif [ $word1=$word2 ]

  then

    echo “word1=word2”

  elif [ $word1=$word3 ]

  then

    echo “word1=word3”

  elif [ $word2=$word3 ]

  then

    echo “word2=word3”

  else

    echo “No match”

  fi

 

6、case 语句

case语句经常用于多重选择,它允许你选择几个模式之一,然后执行哪

个模式的命令序列,其中关键字caseesac必须成对使用,每个模式最后

必须是;;

 

   语法:

 

 语法:                             流程图                         

                                        |     

   case 变量名 in                   ——命令序列1——|

     pat1) 命令序列1;;                |                   | 

     pat2) 命令序列2;;            ——命令序列2——|

     pat3) 命令序列3;;                |                   |

   esac                             ——命令序列3——|

                                        |                     |

                                        |———————————-|

其中pat字段除了可以指定一些确定的字串,也可以指定字符串的集合:

 

*      任意字串

       ?       任意字元

[abc]   a,b,c三字元之一

[a-n]   an的任一字元

 |      多重选择

 

  例题:

   echo ‘Enter A,B,or C:\c’

   read letter

   case $letter in

     A|a) echo ‘You entered A.’;;

     B|b) echo ‘You entered B.’;;

     C|c) echo ‘You entered C.’;;

       *) echo ‘Not A,B,or C.’ ;;

    esac

 

7、continue break 语句

这两者都用于forwhile以及until循环语句。其中,break执行后将

跳转到done后面执行(也即跳出循环),而continue会跳到do后面,继续

执行下一个循环。

 

   Continue语句跳过循环体中该语句之后的语句,直接进行下一个循环。

例如:

  a=0

  while [ $a –le 4 ]

  do

     a=`expr $a + 1`

     if [ $a –le 2 ]

     then

     echo “little”

     continue

     fi

   echo “large”

done

 

  执行结果:little(显示littlecontinue忽略以后的语句,进入下一循环)

little(显示littlecontinue忽略以后的语句,进入下一循环)

large

large

 

    break语句直接跳出循环,而不管循环是否正常结束,通常用于无条件循环语句。

   例如:a=0

         while [ $a –le 5 ]

         do

             a=`expr $a + 1`

             if [ $a –ge 3 ]

             then

                  break

             fi

             echo “little”

         done

         echo “end”

    执行结果:little

              little

              end

 

二、     过程

 

所谓过程,就是一段Shell程序。当一个程序达到一定长度的时候,程序

 的调试和阅读就变的比较困难,通常要将程序划分成若干段落,把完成同一主

 题的若干语句组织到一起,就是一个过程。

 

格式:   过程名()

         {

              命令序列

          }

例如:

menu()

{

   clear

   echo “\n\n\t\t 1) 关闭系统“

   echo “\n\n\t\t 2) 强行关闭“

   echo “\n\n\t\t 3) 重新测试“

   echo “\n\n\t\t 请输入选择:\c”

}

此过程的过程名叫menu,过程体中首先进行清屏,然后显示了一个简单的菜单。过程对于需要经常重复执行的一组命令非常有用,将这组命令放入一个过程中,以后当需要执行的时候只要调用这个过程名即可。

 

在过程中的语句可以通过参数传递接收过程外部的变量值,方法如下:

1、直接使用外部定义的变量。

如:a=10

Check()

{

  . . . .

  sum=`expr $a + 5`

  . . . .

}

2、使用位置参数

如:Check()

{

   echo $1

}

则在程序中以如下方式调用:Check hello

执行时过程中的显示语句回将hello显示出来。

 

Shell程序中执行每一个命令都会有一个返回值,过程也不例外,你可以根据情况用return命令来定义这个值。

 

例如:Check()

{

     if [ $sum –eq 100 ]

     then

            returnno=0

      else

            returnno=9

      fi

      return $returnno

}

check

echo $?

执行结果为:9

 

 这样做的好处是可以根据过程的返回值知道过程执行的情况如何,但要注意,return语句所能返回的只能是数字,有字母组成的字符串将被视为非法。

 

过程的定义不分先后,可随时随地定义,一经定义就可使用。但过程定义后必须调用才可起作用,不经调用等于每定义。

在编写一个Shell程序时,尽量使用过程是一个好的习惯。这样会使程序变的容易阅读,结构功能一目了然。最好是把所有语句都分别包含在各个过程中,最后在定义一个主过程,用来调用其它子过程。如:

 

Ready()

{ . . . . . . }

Getsh()

{ . . . . . . }

Trans()

{ . . . . . . }

Loads()

{ . . . . . . }

main()

{

   Ready

   Getsh

   Trans

   Loads

}

main

 

三、     expr 命令

 

Shell提供expr命令来完成算术运算。

命令格式:expr expression

例如:number=`expr $number + 1`

通常expr命令只将运算结果输出到标准输出上,如果要将结果赋给某个

 变量,就要用到命令替换的方式。上面的例子是将number变量的值加1后再赋

 number变量。

 

Expression是由字符串以及运算符组成,每个字符串或是运算符之间必

 须用空白隔开。否则expr不会计算表达式,而是直接将表达式输出。下面是运

 算符的种类及功能,而优先级则以先后次序排列,我们可以用小括号来改变运

 算符的优先次序。

 

1)    *   乘法                       8) =   等于

2)    /   除法                       9)!=   不等于

3)    %   取余数                    10)>=   大于等于

4)    +   加法                      11) >   大于

5)      减法                      12) &   AND运算

6)    <   小于                      13) |   OR运算

7)    <=   小于等于

 

expression中含有”*”,”(“,”)”等符号时,必须在其前面加上“\”以取消它的特殊含义,以免被Shell解释错误。

 

例如:a=`expr 2 * ( 3 + 4 )` 是错误的

正确的方法应为:a=`expr 2 \* \( 3 + 4 \)`

b=`expr 1.2 + 1` 也是错误的,因为expr只能处理整数运算。

 

此外,利用expr命令还可以完成获得字符串长度的功能。

例如:cxsh=”0000135”

      l=`expr length “$cxsh”`

执行后的结果为:7

阅读(363) | 评论(0) | 转发(0) |
0

上一篇:SHELL编程基础(2)

下一篇:SHELL编程基础(4)

给主人留下些什么吧!~~