如何强制Bash脚本的命令行选项必须用空格分隔、不可合并
Bash 脚本修改方案
核心思路
- 新增前置校验逻辑,直接检查原始输入参数:只要出现以
-开头、不是结束符--、长度大于2且第二个字符不是-(排除长选项)的参数,就判定为合并短选项,直接报错退出 - 修正原脚本中
eval set --"$ARGS"的语法错误,在--后补空格保证参数解析正常
修改后的完整代码
#!/bin/bash # 前置校验:禁止合并短选项 for arg in "$@"; do if [[ $arg == -* && $arg != -- && ${#arg} -gt 2 && ${arg:1:1} != '-' ]]; then echo "无效调用:禁止合并短选项,请使用空格分隔每个选项,正确格式如:temp.sh -f -c 30" >&2 exit 1 fi done ARGS=$(getopt -o c:f -l "charlie:fox" -n "temp.sh" -- "$@"); # 校验getopt解析失败的情况 if [ $? -ne 0 ]; then exit 1 fi eval set -- "$ARGS"; while true; do case "$1" in -c|--charlie) shift; if [ -n "$1" ]; then echo "-c =: $1"; shift; fi ;; -f|--fox) shift; echo "fox used"; ;; --) shift; break; ;; esac done
测试效果
- 合法调用:
./temp.sh -f -c 30
正常输出:fox used -c =: 30 - 非法调用:
./temp.sh -fc30/./temp.sh -fc 30
直接报错退出:无效调用:禁止合并短选项,请使用空格分隔每个选项,正确格式如:temp.sh -f -c 30
内容的提问来源于stack exchange,提问作者Harsh Dua
相关产品推荐
相关产品推荐

