这让我抓狂。关于这个问题有很多帖子,但对我来说都没什么用。我想检查一个文件是否不是 avi 或 mpg,然后我想退出。这是一个简单的例子:
#!/bin/sh
extension="avi"
if [ $extension != "avi" ] || [ $extension != "mpg" ]; then
echo "ERROR: File is not an avi or mpg"
exit 1
fi
echo "I should print out"
这总是返回不应该返回的错误消息。我也尝试过:
if [[ $extension != "avi" ]] || [[ $extension != "mpg" ]]; then
if ([[ $extension != "avi" ]] || [[ $extension != "mpg" ]]); then
if [ $extension != "avi" -o $extension != "mpg" ]; then
我错过了什么?
答案1
您的逻辑有误。两个条件都必须满足,而不仅仅是一个条件,因此您需要使用 AND (&&) 运算符,而不是 OR (||)。请尝试:
if [ $extension != "avi" ] && [ $extension != "mpg" ]; then
或更优雅:
if [ $extension != "avi" -a $extension != "mpg" ]; then
答案2
case
语句正是为这种情况而设计的。 给出的例子如下:
#!/bin/sh
extension="avi"
case "$extension" in
avi | mpg )
echo "I should print out"
;;
* )
echo "ERROR: File is not an avi or mpg"
exit 1
;;
esac
这具有更容易扩展和阅读的明显优势。