如何在 bash 脚本中使用 getopts 有效地测试有效的字符串输入
how to effectively test for valid string input using getopts in bash script
我在 bash 脚本中使用 getopts
来传递 2 个参数。
我正在尝试对 -c <component>
的输入强制执行字符串匹配(使用 if 语句)以输入以下选项:
注意:它必须与这 5 个选项的确切字符串匹配:
customer_builder
customer_service
historic_customer_builder
stream_builder
data_distributor
代码进行中:
# Usage for getopts
usage () {
echo -e "Usage:[=12=] -r region -c <component>"
echo -e "Available components:"
echo -e "customer_builder|customer_service|historic_customer_builder|stream_builder|data_distributor"
echo -e "Example:[=12=] -r us-east-1 -c customer_builder"
}
while getopts ":r:c:" opt; do
case $opt in
r) region="$OPTARG";;
c) component="$OPTARG"
if [[ "${c}" != "customer_builder" && "${c}" != "customer_service" && "${c}" != "historic_customer_builder" && "${c}" != "stream_builder" && "${c}" != "data_distributor" ]]; then
usage
exit 1
fi
;;
*) usage
exit 1
;;
esac
done
我正在尝试使用并需要帮助的主要逻辑:
if [[ "${c}" != "customer_builder" && "${c}" != "customer_service" && "${c}" != "historic_customer_builder" && "${c}" != "stream_builder" && "${c}" != "data_distributor" ]]; then
usage
exit 1
fi
所以在我的测试中,我无法获取要强制执行的字符串。
如果我输入的字符串不正确,我希望得到 usage
:
./script.sh -r us-east-1 -c customer-builder
./script.sh -r us-east-1 -c customer
./script.sh -r us-east-1 -c builder
./script.sh -r us-east-1 -c foo_bar
但是,如果输入正确,我应该期望脚本执行:
./script.sh -r us-east-1 -c customer_builder
./script.sh -r us-east-1 -c customer_service
./script.sh -r us-east-1 -c stream_builder
所以我的问题是您将如何处理和检查正确的字符串输入?
有没有更好的方法来编写我的测试?
您正在测试错误的参数。 $c
未定义,但您刚刚将 -c
的参数保存在 $component
中。
也就是说,另一个 case
语句可能比您的长 if
条件更简单,并且不依赖于 bash
扩展。
case $component in
customer_builder|\
customer_service|\
historic_customer_builder|\
stream_builder|\
data_distributor)
: # Do nothing
;;
*)
usage
exit 1
;;
esac
好的,现在我已经从我的系统中得到 try-to-stay-POSIX-compatible,下面是一个使用 [[...]]
的模式匹配能力的更简单的 if
语句。 (这将在 bash
的较新版本中工作 as-is;旧版本将需要 shopt -s extglob
来启用 @(...)
语法。)
if [[ $component != @(customer_builder|customer_service|historic_customer_builder|stream_builder|data_distributor) ]]; then
我在 bash 脚本中使用 getopts
来传递 2 个参数。
我正在尝试对 -c <component>
的输入强制执行字符串匹配(使用 if 语句)以输入以下选项:
注意:它必须与这 5 个选项的确切字符串匹配:
customer_builder
customer_service
historic_customer_builder
stream_builder
data_distributor
代码进行中:
# Usage for getopts
usage () {
echo -e "Usage:[=12=] -r region -c <component>"
echo -e "Available components:"
echo -e "customer_builder|customer_service|historic_customer_builder|stream_builder|data_distributor"
echo -e "Example:[=12=] -r us-east-1 -c customer_builder"
}
while getopts ":r:c:" opt; do
case $opt in
r) region="$OPTARG";;
c) component="$OPTARG"
if [[ "${c}" != "customer_builder" && "${c}" != "customer_service" && "${c}" != "historic_customer_builder" && "${c}" != "stream_builder" && "${c}" != "data_distributor" ]]; then
usage
exit 1
fi
;;
*) usage
exit 1
;;
esac
done
我正在尝试使用并需要帮助的主要逻辑:
if [[ "${c}" != "customer_builder" && "${c}" != "customer_service" && "${c}" != "historic_customer_builder" && "${c}" != "stream_builder" && "${c}" != "data_distributor" ]]; then
usage
exit 1
fi
所以在我的测试中,我无法获取要强制执行的字符串。
如果我输入的字符串不正确,我希望得到 usage
:
./script.sh -r us-east-1 -c customer-builder
./script.sh -r us-east-1 -c customer
./script.sh -r us-east-1 -c builder
./script.sh -r us-east-1 -c foo_bar
但是,如果输入正确,我应该期望脚本执行:
./script.sh -r us-east-1 -c customer_builder
./script.sh -r us-east-1 -c customer_service
./script.sh -r us-east-1 -c stream_builder
所以我的问题是您将如何处理和检查正确的字符串输入? 有没有更好的方法来编写我的测试?
您正在测试错误的参数。 $c
未定义,但您刚刚将 -c
的参数保存在 $component
中。
也就是说,另一个 case
语句可能比您的长 if
条件更简单,并且不依赖于 bash
扩展。
case $component in
customer_builder|\
customer_service|\
historic_customer_builder|\
stream_builder|\
data_distributor)
: # Do nothing
;;
*)
usage
exit 1
;;
esac
好的,现在我已经从我的系统中得到 try-to-stay-POSIX-compatible,下面是一个使用 [[...]]
的模式匹配能力的更简单的 if
语句。 (这将在 bash
的较新版本中工作 as-is;旧版本将需要 shopt -s extglob
来启用 @(...)
语法。)
if [[ $component != @(customer_builder|customer_service|historic_customer_builder|stream_builder|data_distributor) ]]; then