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:
-
innerhalb von
[
-
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" ]