我有一个获取选项的bash脚本(使用getopts)。假设它们是'-n',' - d',' - u'。我只想选择一个选项,如果没有,它会提示用户错误。
代码是这样的:
while getopts ":dun" name; do
case $name in
d )
DELETE='YES'
;;
u )
UPDATE='YES'
;;
n )
NEW='YES'
;;
esac
done
我一次只能 $ DELETE 或 $ UPDATE 或 $ NEW 成为'YES',这意味着用户无法具体' -n'和'-d'在同一时间或'-u'和'-n'同时,如何在IF语句中实现?
我一直在stackoverflow中寻找这个,但找不到任何。谢谢你的帮助,伙计!
答案 0 :(得分:2)
每次getopts()检测到一个有效的命令行选项时,您都可以递增计数器。然后,在循环测试计数器的值之后。如果它大于1,则指定了多个选项。
答案 1 :(得分:1)
这是一个完整的黑客攻击,取决于选项变量是未设置还是“是”(在我写的形式中,仅限bash):
if [[ "$DELETE$UPDATE$NEW" == YESYES* ]]; then
echo "Please only use one of -d, -u, and -n" >&2
exit 1
fi
(如果你使用的是品牌-x shell而不是bash,那就像if [ "$DELETE$UPDATE$NEW" = "YESYES" -o "$DELETE$UPDATE$NEW" = "YESYESYES" ]; then
)
答案 2 :(得分:0)
最好将变量设置为true
或false
,这样您就可以编写
if $DELETE; then
echo "You've already specified UPDATE!"
fi
和类似的。
然而,调用选项是因为它们应该是可选,并且通常是正交的。 (在一些情况下,常见实用程序的选项相互排斥,但绝大多数都没有)。你想要的实际上是一种强制操作模式,所以你不应该把它作为一个选项接收,而只是作为第一个命令行参数。
答案 3 :(得分:0)
您可以使用一些getopt-kludge来管理只选择其中一个选项。
#!/bin/bash
while [ $# -gt 0 ]; do
case "$1" in
-u)
echo "got -u"
break
;;
-d)
echo "got -d"
break
;;
-n)
echo "got -n"
break
;;
*)
echo "some error"
break
;;
esac
done