查看: 2672|回复: 0

Linux下shell脚本编程基础(二)

  [复制链接]
  • TA的每日心情
    开心
    2013-12-17 13:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2013-6-19 14:53:55 | 显示全部楼层 |阅读模式
    分享到:
    4.loop
        loop表达式
        while ...; do
        ....
        done
        while-loop 将运行直到表达式测试为真。will run while the expression that we test for istrue.
        关键字"break" 用来跳出循环。而关键字continue用来不执行余下的部分而直接跳到下一个循环。
        for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
        for var in....; do
        ....
        done
        在下面的例子中,将分别打印ABC到屏幕上:
        #!/bin/sh
        for var in A B C ; do
        echo "var is $var"
        done
        下面是一个更为有用的脚本showrpm其功能是打印一些RPM包的统计信息

    1.png
    这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。
        如果您运行showrpmopenssh.rpm w3m.rpmwebgrep.rpm
        此时 $* 包含了 3 个字符串,即openssh.rpm,w3m.rpm and webgrep.rpm.

    5. 引号
        在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件,mail.jpg 和tux.jpg。
        1.2 编译SHELL脚本
        #ch#!/bin/shmod +x filename
        cho *.jpg ∪缓螅梢酝ü淙耄?./filename来执行您的脚本。
        这将打印出"mail.jpgtux.jpg"的结果。
        引号 (单引号和双引号)将防止这种通配符扩展:
        #!/bin/sh
        echo"*.jpg"
        echo '*.jpg'
        这将打印"*.jpg"两次。
        单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
        #!/bin/sh
        echo $SHELL
        echo "$SHELL"
        echo '$SHELL'
        运行结果为
        /bin/bash
        /bin/bash
        $SHELL
        最后还有一种防止这种扩展的方法那就是使用转义字符——反斜杆
        echo *.jpg
        echo $SHELL
        这将输出:
        *.jpg
        $SHELL
        6. Heredocuments
        当要将几行文字传递给一个命令时,heredocuments(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 heredocuments就不必用echo函数一行行输出。 一个 "Here document" 以 << 开头,后面接上一个字符串,这个字符串还必须出现在heredocument的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:

    2.png
    3.png
    这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个(特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新文件名。然后使用mv命令进行重命名。
        4)函数
        如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
       functionname()
        {
        # inside thebody $1 is the first argument given to the function
        # $2 thesecond ...
        body
        }
        您需要在每个程序的开始对函数进行声明。
        下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。
        这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。

    4.png
    在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。
        命令行参数
        我们已经见过$* 和$1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值(比如文件名)。
        有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。

    5.png
    您可以这样运行该脚本:
        cmdparser -l hello -f -- -somefile1 somefile2
        返回的结果是:

    6.png
    这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-12 10:48 , Processed in 0.113295 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.