我(大概是每个人)时不时地遇到这个问题,但我自己找不到任何好的解决方法。当getopts
查找参数时,即使它是一个选项,它实际上也会接受下一个参数。这就是我做的停止(代码片段):
#!/bin/bash
function optsGet()
{
while getopts ":c:f" opt; do
case $opt in
c ) [[ -z "${OPTARG}" || "${OPTARG}" == -* ]] \
&& { echo -e "ERROR: Invalid argument\n"; exit 1; }
CNAME="${OPTARG}.tEsTsTr"
;;
f ) FORCE=true
;;
\?) echo -e "Invalid option: -$OPTARG\n" >&2;;
: ) echo -e "Missing argument for -$OPTARG\n" >&2; exit 1;;
* ) echo -e "Unimplemented option: -$OPTARG\n" >&2; exit 1;;
esac
done
shift $(($OPTIND - 1))
}
optsGet "${@}"
echo -e "CNAME: ${CNAME}\n"
但仍然将空白/ null作为有效参数。所以,这有效:
san@AM0150 testtools$ ./getopts.sh -c -f
ERROR: Invalid argument
但这些不是:
san@AM0150 testtools$ ./getopts.sh -c " " -f
CNAME: .tEsTsTr
san@AM0150 testtools$ ./getopts.sh -c \ -f
CNAME: .tEsTsTr
我非常期待Missing argument for -c
错误。这里有什么我想念的吗?或者有人知道解决方法吗?任何意见都将非常感激。干杯!!
<小时/> 更新(主要基于 devnull 的回复):
为了完整,现在我有了这个小功能:
function ifEmpty()
{
local VAL=$1
local OPT=$2
[[ -z "${VAL}" || "${VAL}" =~ ^[[:space:]]*$ || "${VAL}" == -* ]] \
&& { echo -e "\n ERROR: Missing argument for option: -${OPT}\n" >&2; exit 1; }
}
然后可以这样使用:
c ) ifEmpty "${OPTARG}" "${opt}"
CNAME=${OPTARG//[[:space:]]}
;;
表示需要参数的所有选项。干杯!!
PS。出于某种原因,*[[:space:]]*
在函数中使用时不起作用。
答案 0 :(得分:4)
-z
将返回true,而不是包含 spaces 的字符串。
检查字符串是否仅包含空格。说:
c ) [[ -z "${OPTARG}" || "${OPTARG}" =~ ^[[:space:]]*$ || "${OPTARG}" == -* ]] \
而不是
c ) [[ -z "${OPTARG}" || "${OPTARG}" == -* ]] \
这也会处理null(\
)情况。
EDIT:
实际上,它也可以写成:
c ) [[ -z "${OPTARG}" || "${OPTARG}" == *[[:space:]]* || "${OPTARG}" == -* ]] \
答案 1 :(得分:-1)
这可能是一个非答案的答案,但我不会试图阻止它。如果-c
将文件名作为参数,则-f
可以是有效的文件名,
(空格)也可以。作为一般规则,我不认为shell脚本应该做“有用”的事情,比如修剪空格或抛出不寻常但技术上有效的参数。