终端命令通常包含一些参数,在使用的时候可以提供不同的参数来确定命令的执行方式。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使其变得简单。
全部0条评论
快来发表一下你的评论吧 !