第十章 构建基本脚本

来源:互联网 发布:直销矩阵制示意图 编辑:程序博客网 时间:2024/05/21 05:05

 创建shell脚本文件:

      在创建shell键本文件时,必须在文件的第一行指定要使用的shell;格式为:

       #! /bin/bash

      通常, #用作注释行,不被shell执行。但shell脚本的第一行是个特例,井号后接叹号告诉shell用哪个shell来运行脚本。

      第一行之后,通常就在下面加一行注释行,由#开头,然后写下此脚本的用途(要养成这个好习惯)。

显示消息

     echo命令能显示一个简单的文本字符串。

     echo This is a test

     This is a test。

     默认情况下不需要使用引号将要显示的文本字符串圈起来。但有时在文本中出现引号就比较麻烦。

     echo Let's see if this 'll work.

    此时,你需要这样写

     echo "Let's see if this'll work。

     echo命令是shell脚本中同用户交互的重要工具。你会在很多情况下用到它,尤其是当你要显示脚本中变量的值时。

使用变量

     环境变量:先用set指令列出一份完整的活动的环境变量,然后可以在环境变量名称前加个美元符($)来载脚本中使用这些环境变量。如下脚本:

    #!/bin/bash

    #display user information from the system.

    echo "User info for userid: $USER"

    echo UID: $UID.

    但有时,这并不都有效,例如我想显示美元,echo "The cost of the item is $15"。运行时会显示The cost of the item is 5.要显示美元符,必须在前面加个转义符,即反斜杠\。如下: echo “The cost of thie item is \$15"


用户变量:

    除了环境变量,shell脚本还允许在脚本中定义和使用自己的变量。

   用户变量可以是不超过20个字母、数字或下划线的文本字符串,区分大小写。

   值通过等号赋给用户变量。在变量、等号和值之间不能出现空格(困扰初学者的地方)。一些例子如下:

    var1=10;

    var2=testing;

    var3="still more  testing"

    shell脚本会自动决定变量值的数据类型。在脚本的正个生命周期里,shell脚本定义的变量会一直保持他们的值。知道shell脚本完成时删除。类似于系统变量,用户变量可以通过美元符引用:

   #!./bin/bash

   # testing variables

   days=10

   guest="Katie" #这里可以不用加双引号

   echo "$guest checked in $days days ago"

   变量每次引用时,都会输出当前赋予它的值。引用一个变量时需要使用美元赋,而引用变量来对它进行赋值时则不能使用美元符。例子如下:

   #! /bin/bash

   #assigning a variable value to a value

   value1=10

   value2=$value1

   echo The resulting value is $value2

   此脚本的结果是:The resulting value is $value2.

   但如果忘了$,使得value2赋值行变成这样: value2=value1. 输出会是The resulting value is value1.没有美元符,shell会将变量名解释成普通的文本字符串。


反引号

      shell中最有用的特性之一就是反引号。提示:在美式键盘上,它通常和波浪线(~)位于同一个键位。

     必须用反引号把整个命令行命令圈起来: testing=`date`

     shell会运行反引号中的命令,并将其输出赋给变量testing。例子如下:

     #! /bin/bash

     # using the backtick character

     testing=`date`

     echo "The date and time are: " $testing 

重定向输入和输出

 输出重定向:

     command>outputfile

     重定向操作符创建了一个文件(通过默认的umask设置权限)。如果文件本存在,则会将新的数据覆盖已经存在的文件。若不想覆盖,则需要改>为>>.

  输入重定向:

      和输出重定向正好相反。command<file;

      还有另外一种输入重定向,称为内联输入重定向。这种方法允许你在命令行而不是在文件指定输入重定向的数据。内联输入重定向使用的是<<(双小于号)。

除了这个符号,你必须要指定一个文本标记来划分要输入数据的开始和结尾。可以用任何字符串的值来作为文本标记,但在数据的开始和结尾必须一致:

      command<<marker

      data

      marker

      一个例子:

      wc<<EOF

     >test string1

     >test string2

     >test string3

     >EOF

          3      9       42


管道

     虽然重定向很有用,但仍然是一种比较繁琐的生成信息的方式。取代将命令的输出重定向到文件,可以重定向输出到另一个命令。这个过程就称为管道链接。

     command1 | command2

     在管道中,链接并不会一个接一个的运行。Linux系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会立刻送给第二个命令,传输数据不会用到任何中间文件或缓冲区域。

     可以在一条命令中使用任意多条管道。


执行数学运算

   shell脚本中有两种途径来进行数学运算操作。

      expr命令:允许在命令行上处理数学表达式,但比较笨拙。注意:操作符两边都有空格,否则输不出运算结果。由于expr指令处理起来会带来很多的问题,所以一般不用,下面有个改进的指令。

使用方括号:

     在bash中,将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式圈起来:

     var1=$[ 1 + 5 ]

     echo $var1

    6

     var2=$[ $var1 * 2 ]

     echo $var2

     12  

     但方括号也有一个限制,就是只支持整数运算。要进行任何的数学运算,回事一个巨大的限制。


浮点解决方案:

     最常见的解决方法就是用内建的bash计算器,称作bc。  

  bc的基本用法:

     bash计算器其实是允许你在命令行输入浮点表达式、解释表达式、计算并返回结果的一种编程语言。bash计算器能识别:

       数字(整数和浮点数);

      变量(简单变量和数组);

      注释(以井号开始的行或C语言中的/* */对);

      表达式;

      编程语句(例如if-then 语句);

      函数。

      浮点运算是由一个内建的称为scale的变量控制的。你必须将这个值设置为结果里你想要的小数点后的位数,否则你不胡得到你想要的结果:

     bc  -q

     3.44 / 5

     0

     scale=4

     3.44 / 5

     .6880

     quit

     scale变量的默认值是0.在scale被设置前,bash计算器提供的答案没有小数点后的位置。在将其值设置成4后,bash计算器显示的答案有四位小数。

     除了普通字,bash计算器还能支持变量:

    bc  -q  (-q参数会将bc输出的很长的欢迎条屏蔽掉)

    var1=10

    var1  * 4

    40

    var2=var1 / 5

    2

    quit

    一旦变量的值被定义了,你就可以在整个bash计算器会话中使用变量了。printf 语句允许你打印变量和数字。

 

在脚本中使用bc

    可以使用反引号来运行bc命令并将输出赋给一个变量。基本格式是:

    variable=`echo "options: expression" | bc`

    第一部分options允许你来设置变量。如果你需呀设置不止一个变量,可以用分号来分开它们。expression参数定义了通过bc执行的数学额表达式。例子:

    #! /bin/bash

    var1=`echo "scale=4; 3.44 / 5" | bc`

    echo The answer is $var1

    但如果有很多运算,那么在同一个命令行中列出多个表达式就会有点麻烦。

    针对 这个问题,解决之道是:bc能识别输入重定向,允许将一个文件重定向到bc命令来处理。然而这样也同样麻烦,因为你必须将表达式存储到文件中。

    最好的办法是使用内联输入重定向,允许你直接在控制台重定向数据。在shell脚本中,可以将输出赋给一个变量:

    variable=`ba << EOF

    options

    statements

    expressions

    EOF

    `

    #! /bin/bash

    var1=10.46

    var2=43.67

    var3=33.2

    var4=71

    var5=`bc << EOF

    scale=4

    a1 = ( $var1 * $var2)

    b2 = ( $var3 * $var4)

    a1 + b1

    EOF

    `

     echo The final answer for this mess is $var5

退出脚本

     shell中运行的每个命令都使用推出状态码(exit status)来告诉shell它完成了处理。推出状态码是一个0~255之间的整数值,在命令结束运行时由命令传给shell。

   查看退出状态码

      Linux提供了$?专属变量来保存上个执行的命令的推出状态码。必须在你要查看的命令之后马上查看或使用$?变量。它的值会变成shell中执行的最好哦一条命令的推出状态码:

      $ date

      Sat  Jan  15  10:01:30 EDT 2011

      $ echo $?

      0

      $

      按照惯例,一个成功结束的命令的退出状态码是0. 如果一个命令结束时有错误,推出状态码中就会有一个正数值:

      $ asdfg

      -bash: asdfg: command not found

      $ echo $?

      127

      无效命令会返回一个推出状态码127.

     下表为Linux推出状态码:

                                状态码                                                                            描述

                                   0                                                                             命令成功结束

                                   1                                                                             通知未知错误

                                   2                                                                             误用shell命令

                                  126                                                                          命令不可执行

                                  127                                                                          没找到命令

                                  128                                                                          无效退出参数

                                  128+x                                                                      Linux信号x的严重错误

                                  130                                                                          命令通过Ctrl+C终止

                                  255                                                                          退出状态码越界

     推出状态码为126表明用户没有执行命令的正确权限  

     $ ./myprog.c

         -bash: ./myprog.c : Permission denied

        $ echo $?

        126

      另一个会经常碰到的常见错误是给某个命令提供了无效参数:

       $ date %t

        date: invalid date '%t'

       $ echo $?

       1

    exit命令

        默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出:

        $ ./test6

        The result is 2

        $ echo $?

        0

        exit命令允许你在脚本结束时指定一个推出状态码:

        #! /bin/bash

        # testing the exit status

        var1=10

         var2=30

        var3=$[ $var1 + var2 ]

        echo The answer is $var3

       exit 5

       注意:退出状态码最大只能是255。

      

    

      



0 0