GNU/Linux >> Linux Esercitazione >  >> Linux

Parentesi in condizione if:perché ricevo errori di sintassi senza spazi bianchi?

Sto usando lo script seguente per tornare indietro di due giorni quando lo script viene eseguito all'inizio di due giorni dell'anno e anche controllare il primo e il secondo giorno di ogni mese e tornare indietro di due giorni.

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

Ma il mio male sto ricevendo il seguente messaggio di errore

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

Risposta accettata:

[ non è né un metacarattere né un operatore di controllo (nemmeno una parola riservata; lo stesso per ] ) quindi ha bisogno di uno spazio bianco attorno ad esso. Altrimenti la shell “vede” il comando [01=01] invece del comando [ con i parametri separati 01 , = , 01 e ] . Ogni operatore e operando deve essere un argomento separato per [ comando, quindi è necessario anche uno spazio vuoto attorno agli operatori.

if [ "$month" = "01" ]

[$month="01"] è un modello di caratteri jolly che corrisponde a uno qualsiasi dei caratteri in $month o "01 . Se non corrisponde a nulla, viene lasciato in pace.

Se è presente un punto e virgola dopo la parentesi di chiusura, non è necessario uno spazio prima, perché il punto e virgola fa sempre parte di un token separato.

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

Lo stesso vale per la sintassi doppia parentesi di bash (e ksh e zsh).

Più di una condizione

Esistono due modi per combinare le condizioni:

  1. all'interno di [

  2. con [ separato comandi combinati con && o ||

Il raggruppamento tra parentesi è probabilmente più facile all'interno di [ .

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

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

Il primo dovrebbe essere evitato in quanto inaffidabile (prova ad esempio con month='!' ). I problemi con contenuto variabile strano possono essere evitati usando prima la stringa sicura (se presente); o utilizzando [[ /]] invece di [ /] :

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

Linux
  1. Perché una funzione principale senza un'istruzione return restituisce il valore 12?

  2. Tomcat si avvia senza errori ma non è in ascolto su 8080

  3. Convenzioni di sintassi delle pagine man di Linux/Unix

  4. perché ricevo un errore di formato Exec quando scrivo il mio servizio Linux?

  5. Perché ricevo Autorizzazione negata quando eseguo ssh-add?

Grep:perché le parentesi nel modello Grep rimuovono il processo Grep dai risultati di Ps?

Controllare i file di configurazione di Linux per errori di sintassi

Errori PHP

Come posso controllare la sintassi di uno script Bash senza eseguirlo?

Esegui un ls senza ottenere il percorso completo

Come posso inviare un comando a un file, senza ottenere un file vuoto per errore?