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:
-
all'interno di
[
-
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" ]