我现在正在编写一个 bash shell 脚本,其中一个规范是,如果第一个参数 $1 不是 -e 或 -d,我需要打印一条错误消息,这就是我所做的:
if [ "$1" != "-e" ] || [ "$1" != "-d" ]; then
echo "Error: First argument must be either -e or -d"
exit 1
fi
然而,这似乎不起作用,因为即使我使用 -e 或 -d 作为第一个参数,仍然会打印此错误消息。我做错了什么以及如何解决这个问题?
答案1
如果$1
是-d
,则第一个条件为真。如果$1
是-e
,则第二个条件为真。如果有其他的话,两者都是真的。自从你加入他们以来||
(或者), 这然后的分支如果如果任一为真,则采用。因此,然后分支总是被占用。
您需要if [ "$1" != "-e" ] && [ "$1" != "-d" ]
使用然后$1
仅当不是时才分支-e
和不是-d
。
答案2
case $1 in
-d) ;; # nothing to do
-e) ;; # nothing to do
*)
echo 'Error: First argument must be either -e or -d' >&2
exit 1
esac
这将触发exit 1
if是or$1
以外的任何内容。-d
-e
或者,根据使用的选项和对其执行的操作设置一个标志(我倾向于将其分开解析命令行选项来自表演在他们):
case $1 in
-d) dflag=1 ;;
-e) dflag=0 ;;
*)
echo 'Error: First argument must be either -e or -d' >&2
exit 1
esac
# Getting here means:
# - $1 was either -d or -e
# - $dflag will show which one it was
if [ "$dflag" -eq 1 ]; then
# act on -d option
else
# act on -e option
fi
作为ilkkachu已经阐明了,您的问题(除了缺少的双引号)是逻辑之一(布尔运算)。上面,我只是展示了另一种执行操作的方法。case
...esac
语句通常用于处理命令行选项。