GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Klammern in der If-Bedingung:Warum erhalte ich Syntaxfehler ohne Leerzeichen?

Ich verwende das folgende Skript, um zwei Tage nach hinten zu verschieben, wenn das Skript an zwei Tagen des Jahres ausgeführt wird, und überprüfe auch den ersten und zweiten Tag jedes Monats und gehe zwei Tage zurück.

if [$month="01"] && [$day="01"];
then
    date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
         date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
   if [ $day = "01" ];
then
    date="$last_month/$yes_day/$year"
            fulldate="$year$last_month$yes_day"
else
        if [ $day = "02" ];
then
    date="$last_month/$yes_day/$year"
        fulldate="$year$last_month$yes_day"
else
    date="$month/$yes_day/$year"
        fulldate="$year$month$yes_day"
                fi
               fi
              fi
fi

Aber leider bekomme ich die folgende Fehlermeldung

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

Akzeptierte Antwort:

[ ist weder ein Metazeichen noch ein Kontrolloperator (nicht einmal ein reserviertes Wort; dasselbe gilt für ] ) daher braucht es Leerzeichen um sich herum. Andernfalls „sieht“ die Shell den Befehl [01=01] anstelle des Befehls [ mit den separaten Parametern 01 , = , 01 , und ] . Jeder Operator und Operand muss ein separates Argument für [ sein Befehl, daher sind auch Leerzeichen um die Operatoren herum erforderlich.

if [ "$month" = "01" ]

[$month="01"] ist ein Platzhaltermuster, das mit einem der Zeichen in $month übereinstimmt oder "01 . Wenn es mit nichts übereinstimmt, wird es in Ruhe gelassen.

Wenn nach der schließenden Klammer ein Semikolon steht, brauchen Sie kein Leerzeichen davor, da das Semikolon immer Teil eines separaten Tokens ist.

if [ "$month" = "01" ]; then

Dasselbe gilt für die Doppelklammer-Syntax von bash (und ksh und zsh).

Mehr als eine Bedingung

Es gibt zwei Möglichkeiten, Bedingungen zu kombinieren:

  1. innerhalb von [

  2. mit separatem [ Befehle kombiniert mit && oder ||

Das Gruppieren mit Klammern ist innerhalb von [ wahrscheinlich einfacher .

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

Ersteres sollte vermieden werden, da es unzuverlässig ist (versuchen Sie es zum Beispiel mit month='!' ). Probleme mit seltsamen Variableninhalten können vermieden werden, indem zuerst der sichere String (falls vorhanden) verwendet wird; oder mit [[ /]] statt [ /] :

if [ "01" = "$month" -a "01" = "$day" ]

Linux
  1. Warum wird die Bash-Eingabeaufforderung fehlerhaft, wenn ich den Verlauf durchsuche?

  2. Sind Bash-Tests so wählerisch in Bezug auf Leerzeichen?

  3. Warum funktioniert die Variablenerweiterung ohne $ in Ausdrücken?

  4. Überprüfen Sie die Linux-Konfigurationsdateien auf Syntaxfehler

  5. PHP-Fehler

Wie überprüfe ich die Syntax eines Bash-Skripts, ohne es auszuführen?

Wie überprüfe ich meine Apache-Webserverkonfiguration auf Syntaxfehler?

Tomcat startet ohne Fehler, hört aber nicht auf 8080

Syntaxkonventionen für Linux/Unix-Manpages

Tipps, wie Sie Docker zum Laufen bringen, ohne `sudo docker -d` unter Ubuntu 15.04 ausführen zu müssen

Warum habe ich keine Syntaxhervorhebung, wenn ich sudo vi <Dateiname> drücke?