Ich verwende das folgende Skript, um zwei Tage zurück zu verschieben, wenn das Skript an zwei Tagen im Jahr ausgeführt wird. Außerdem überprüfe ich den ersten und zweiten Tag jedes Monats und verschiebe 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 mein schlechtes bekomme die folgende Fehlermeldung
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
bash
shell
shell-script
test
whitespace
Kumar1
quelle
quelle
[
. Überprüfen Sie außerdem dieelif
Anweisung. Es wird Ihnen helfen, die Dinge aufzuräumen. Auch die Semikolons nach den if-Anweisungen sind nicht notwendig, aber auch nicht falsch, nur seltsam.if [ ... ]; then
), also nicht so ungewöhnlich.Antworten:
[
ist weder ein Metazeichen noch ein Steueroperator (nicht einmal ein reserviertes Wort; dasselbe für]
) und benötigt daher Leerzeichen. Andernfalls ist die Shell „sieht“ den Befehl[01=01]
anstelle des Befehls[
mit den separaten Parameter01
,=
,01
, und]
. Jeder Operator und Operand muss ein separates Argument für den[
Befehl sein, daher ist auch für die Operatoren ein Leerzeichen erforderlich.[$month="01"]
ist ein Platzhaltermuster, das mit einem der Zeichen in$month
oder übereinstimmt"01
. Wenn es zu nichts passt, bleibt es in Ruhe.Befindet sich nach der schließenden Klammer ein Semikolon, brauchen Sie kein Leerzeichen, da das Semikolon immer Teil eines separaten Tokens ist.
Gleiches gilt für die doppelte Klammersyntax von bash (und ksh und zsh).
Mehr als eine Bedingung
Es gibt zwei Möglichkeiten, Bedingungen zu kombinieren:
innerhalb
[
mit separaten
[
Befehlen kombiniert mit&&
oder||
Das Gruppieren mit Klammern ist innerhalb von wahrscheinlich einfacher
[
.Das erste sollte vermieden werden, da es unzuverlässig ist (versuchen Sie es zum Beispiel mit
month='!'
). Probleme mit seltsamem Variableninhalt können vermieden werden, indem zuerst die sichere Zeichenfolge (falls vorhanden) verwendet wird. oder mit[[
/]]
anstelle von[
/]
:quelle
[
Wenn-a
/-o
werden nicht verwendet ist immer zuverlässig mit POSIX-kompatiblen Shells. Die Verwendung von-a/-o
over hat keinerlei Vorteil&&/||
. Ich würde definitiv von seiner Verwendung abraten. Beachten Sie, dass dies[[
kein POSIX ist.Ein anderer Weg, es zu schreiben:
quelle
case
Aussage. Wenn Sie mehr als eine habenelif
, sollten Sie wahrscheinlich verwendencase
.Das ist also deine Antwort:
Sie müssen also "Leerzeichen" zwischen eckige Klammer und Variable / Wert setzen.
quelle
==
anstelle von standard=
.[
aka-test
Befehl lautet=
.[
Wenn für Tests keine Zuordnung erforderlich ist, muss keine eindeutige Zuordnung vorgenommen werden. Einige[
Implementierungen werden==
als Erweiterung des Standards unterstützt, jedoch nicht alle. Das Bourne - Shell sind,ash
's,posh
s[
s oder die/bin/[
von einigen Systemen zum Beispiel nicht.==
wurde hinzugefügt , indemksh
ich an , dass für die Übereinstimmung mit dem gleichen Betreiber in seinem neuen(( ... ))
Konstrukt (die beide = hat und ==, aber es keinen Standard)