it-swarm.com.de

Bash if-Anweisung mit mehreren Bedingungen löst einen Fehler aus

Ich versuche, ein Skript zu schreiben, das zwei Fehlerflags überprüft, und falls ein Flag (oder beide) geändert werden, ist ein Echofehler aufgetreten. Mein Drehbuch:

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

Grundsätzlich sollte es etwas sein, zusammen:

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

Der Fehler, den ich erhalte, ist:

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

Sind meine Klammern durcheinander?

138
Simply_me

Verwenden Sie -a (für und) und -o (für oder).

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

Aktualisieren

Tatsächlich könnten Sie noch && und || mit der Operation -eq verwenden. Ihr Skript würde also so aussehen:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

Obwohl Sie in Ihrem Fall die letzten beiden Ausdrücke verwerfen und einfach bei einem oder einer der folgenden Vorgänge bleiben können:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi
207
mkhatib

Sie können entweder das Schlüsselwort [[ oder (( verwenden. Wenn Sie das Schlüsselwort [[ verwenden, müssen Sie Zeichenfolgenoperatoren wie -eq, -lt verwenden. Ich denke, (( wird am meisten für die Arithmetik bevorzugt, weil Sie Operatoren wie ==, < und > direkt verwenden können.

Verwenden des Operators [[

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

Verwenden des Operators ((

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

Verwenden Sie nicht die Operatoren -a oder -o, da dies nicht tragbar ist.

53
Fizer Khan

Bitte versuche folgendes

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"
7
Manash Nath

Sie können sich inspirieren lassen, indem Sie ein entrypoint.shSkript lesen, das von den Mitwirkenden von MySQL geschrieben wurde und prüft, ob die angegebenen Variablen gesetzt wurden.

Wie das Skript zeigt, können Sie sie mit -a weiterleiten, z.

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi