在 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
关键字会使所有参数位移一位,这样位置 2($2
)的参数移动到位置 1($1
)。处理完所有参数后会触发 else
语句,进而中断 while
循环。
在脚本的末尾,$ALPHA
的值会输出到终端。
测试一下这个脚本:
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
可以看到,选项被正确地检测到了。
但上面的脚本还有一个问题:多余的参数被忽略了。
$ 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
关键字,但参数需要位移两位而不是一位。
#!/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
选项需要一个参数)。所有参数都位移两位:其中一位是跳过 --config
或 -c
,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。
下面是新版脚本的测试:
$ 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 让解析选项成为了一件简单的事。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。