暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何在bash shell脚本中接受参数

TIAP 2021-09-01
1624

终端命令通常包含一些参数,在使用的时候可以提供不同的参数来确定命令的执行方式。POSIX规范中包含了用于命令行接口的选项。这也是与最早的UNIX应用程序建立的一个由来已久的约定,所以当你在写bash脚本的时候,需要知道如何在脚本中接受参数。


bash中的参数(选项)解析

Bash中解析选项的策略是循环遍历传递给shell脚本的所有参数,确定它们是不是选项,然后切换到下一个参数。重复此过程,直到没有剩余选项。

从一个简单的布尔选项(有时称为开关或标志)开始:

    #!/bin/bash


    while [ True ]; do
    if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
    else
    break
    fi
    done


    echo $ALPHA


    在这段代码中,我创建了一个while循环,它作为一个无限循环,直到没有更多的参数要处理为止。if语句尝试将在第一个位置($1)找到的任何参数与--alpha或-a匹配(这些是没有特殊意义的任意选项名称。在实际脚本中,可以使用--verbose和-v来触发详细输出)。

    shift关键字使所有参数移位1,这样位置2($2)中的参数将移动到位置1($1)。当没有其他参数要处理时,将触发else语句,这将中断while循环。

    在脚本的末尾,将$ALPHA的值打印到终端。


    测试一下这个脚本:

      $ bash ./test.sh --alpha
      1
      $ bash ./test.sh


      $ bash ./test.sh -a
      1

      已正确检测到该选项。


      检测Bash中的参数

      但有一个问题:额外的参数被忽略。

        $ bash ./test.sh --alpha foo
        1
        $


        要捕获不作为选项的参数,可以将剩余参数转储到Bash数组中。

          #!/bin/bash


          while [ True ]; do
          if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
          ALPHA=1
          shift 1
          else
          break
          fi
          done


          echo $ALPHA


          ARG=( "${@}" )
          for i in ${ARG[@]}; do
          echo $i
          done


          测试一下修改后的脚本:

            $ bash ./test.sh --alpha foo
            1
            foo
            $ bash ./test.sh foo


            foo
            $ bash ./test.sh --alpha foo bar
            1
            foo
            bar


            带参数的选项

            有些选项本身需要一个参数。例如,您可能希望允许用户设置图形的颜色或分辨率等属性,或者将应用程序指向自定义配置文件。

            要在Bash中实现这一点,可以像使用布尔开关一样使用shift关键字,但将参数移位2而不是1。

              #!/bin/bash


              while [ True ]; do
              if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
              ALPHA=1
              shift 1
              elif [ "$1" = "--config" -o "$1" = "-c" ]; then
              CONFIG=$2
              shift 2
              else
              break
              fi
              done


              echo $ALPHA
              echo $CONFIG


              ARG=( "${@}" )


              for i in ${ARG[@]}; do
              echo $i
              done


              在这段代码中,我添加了一个elif子句来将每个参数与--config和-c进行比较。在匹配的情况下,名为CONFIG的变量的值被设置为第二个参数的值(这意味着--CONFIG选项需要一个参数)。所有参数移位2:1移位--config或-c,1移位其参数。与往常一样,循环会重复,直到没有匹配的参数。

              下面是对新版本脚本的测试:

                $ bash ./test.sh --config my.conf foo bar
                my.conf
                foo
                bar
                $ bash ./test.sh -a --config my.conf baz
                1
                my.conf
                baz


                选项解析变得很容易

                在Bash中还有其他解析选项的方法。您可以交替使用case语句或getopt命令。无论您选择使用什么,用户的选项都是任何应用程序的重要特性,Bash使其变得简单。


                文章转载自TIAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论