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

描述

终端命令通常包含一些参数,在使用的时候可以提供不同的参数来确定命令的执行方式。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使其变得简单。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分