Shell脚本 - If子句的两个条件

时间:2014-10-13 18:44:31

标签: bash shell if-statement

#!/bin/bash

(...)

if [ "$1" == "" ] || [ "$2" == "" ] || [ "$3" == "" ] || [ "$4" == "" ] ; then # WORKS!  
echo "Erro  #1: Nao inseriu todos os argumentos necessarios! Tente novamente!"  
echo "Ajuda #1: Lembre-se, ep1.sh [diretoria] [modo] [informação] <nome_do_ficheiro>"

elif [[ "$2" != "contar" || "$2" != "hist" ]] ; then **# THE PROBLEM!!!**  
echo "Erro  #2: O segundo argumento está incorrecto! Tente novamente!"  
echo "Ajuda #2: Use contar ou hist."

elif [[ "$3" != "palavras" || "$3" != "bytes" ]] ; then # CAN'T TEST BECAUSE OF FIRST ELIF  
echo "Erro  #3: O terceiro argumento está incorrecto! Tente novamente!"  
echo "Ajuda #3: Use palavras ou bytes."

(...)

fi

所以,我的问题出在第一个elif,当elif为假时,程序不应该输入elif,而是进入。

我看不出可能出现什么问题。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

使用&&而非||

elif [[ "$2" != "contar" && "$2" != "hist" ]] ; then

切换运营商的原因是De Morgan's law。如果你否定

if [[ $a == "foo" || $b == "bar" || $c == "baz" ]]

你得到了

# negated
if ! [[ $a == "foo" || $b == "bar" || $c == "baz" ]]

De Morgan的法律规定,您可以通过将所有!切换为==并将!=更改为||来分发&&

# `!` distributed per De Morgan's law
if [[ $a != "foo" && $b != "bar" && $c != "baz" ]]