bash - 如何在 Bash 中验证逗号分隔的选项参数?
问题描述
如何验证参数列表的可能组合?
我的脚本看起来像这样,它验证用户是否传递了苹果、香蕉或芒果以外的参数:
validate() {
if [[ "$2" != "apple" ]] && [[ "$2" != "mango" ]] && [[ "$2" != "banana" ]]; then
echo "--fruits should always be \"apple\", \"mango\", \"banana\""
fi
}
args_() {
if [[ $# -eq 0 ]]; then
echo "please enter valid parameter"
fi
for ARGUMENT in "$@"; do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
--fruits)
validate ${KEY} ${VALUE}
;;
*) ;;
esac
done
}
args_ $*
但是如果用户也组合传递参数,我想通过验证。例如
bash validate.sh --fuits=apple,mango
或者
bash validate.sh --fruits=apple,banana,mango
有没有办法验证 bash 中可能的参数列表?
解决方案
您可以将 ',' 转换为 ' ' 以将您的论点作为一个数组并在其中创建一个 for 循环:
for FRUIT in $(echo $VALUE | tr ',' ' '); do
validate ${KEY} ${FRUIT}
done
在您的代码中:
args_() {
...
case "$KEY" in
--fruits)
for FRUIT in $(echo $VALUE | tr "," " "); do
validate ${KEY} ${FRUIT}
done
;;
*) ;;
esac
...
测试:
$ bash main.sh --fruits=apple # Accepted
$ bash main.sh --fruits=apple,mangodd # Not Accepted - Typo
--fruits should always be "apple", "mango", "banana"
$ bash main.sh --fruits=apple,banana # Accepted
这也是我的代码版本:
#!/usr/bin/env bash
# List of your fruits
FRUIT_LIST=(apple banana mango)
# Validate Function
validate() {
ACCEPTED_MSG="$2 is Accepted."
NOT_ACCEPTED_MSG="$2 is wrong, check $ $0 --help"
(for e in "${FRUIT_LIST[@]}"; do [[ "$e" == "$2" ]] && exit 0; done) && echo $ACCEPTED_MSG || echo $NOT_ACCEPTED_MSG
}
# Return Help
usage() {
cat <<EOF
usage: $0 [OPTIONS]
Options:
--fruits=[fruit] Validate your fruit(s)
Example:
$0 --fruits=banana,mango
EOF
}
# Main Functionality
main() {
[ $# -eq 0 ] && echo "please enter valid parameter"
for ARGUMENT in "$@"; do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
--fruits)
for FRUIT in $(echo $VALUE | tr "," " "); do
validate ${KEY} ${FRUIT}
done
;;
*)
usage
;;
esac
done
}
# Run Main
main $*
推荐阅读
- html - 如何在 HTML 有序列表中使用数字和字母
- reactjs - 如何仅在匹配的路由异步加载后才使反应路由器替换组件..?
- c - 在 lex 和 yacc 之间传递 union 的内容
- qt - 未安装错误模块“QtQuick”2.12 版
- sql - SQL Server 复杂聚合筛选
- python - python - 在每个组上方添加每个组的名称
- html - 如何设置div的宽度
- php - 在 PHP 字符串中检查手机号码与否
- node.js - 我该如何存根依赖于先前函数结果的函数?
- android - 使用 Proguard 混淆 Cordova Android 应用程序似乎无济于事