Ich versuche, ein Skript zu schreiben, das zwei Fehlerflags überprüft. Wenn ein Flag (oder beide) geändert werden, wird ein Echo ausgegeben - ein Fehler ist aufgetreten. Mein Skript:
my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then
echo "$my_error_flag"
else
echo "no flag"
fi
Grundsätzlich sollte es etwas sein:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
Der Fehler, den ich bekomme, ist:
line 26: conditional binary operator expected
line 26: syntax error near `]'
line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'
Sind meine Klammern durcheinander?
bash
if-statement
flags
Einfach ich
quelle
quelle
a==1 or b==2
deckt bereits der Fall ab, in dema==1 and b==2
. Separat zu testen ist hier völlig überflüssig.Antworten:
Verwenden Sie
-a
(für und) und-o
(für oder) Operationen.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Aktualisieren
Eigentlich könnte man noch verwenden
&&
und||
mit dem-eq
Betrieb. Ihr Skript würde also so aussehen:Obwohl Sie in Ihrem Fall die letzten beiden Ausdrücke verwerfen und einfach bei einem oder einer Operation wie dieser bleiben können:
quelle
[
und]
Gruppieren (das tun sie nicht) und das Nicht-Platzieren von Leerzeichen um den Operator (z. B."$my_error_flag"="1"
), wodurch verhindert wird, dass die Shell ihn überhaupt als Operator erkennt. Bitte lesen Sie BashFAQ Nr. 17 (zur Gruppierung) und Nr. 31 (zum Unterschied zwischen verschiedenen Arten von Testausdrücken ) . In diesem Fall wäre es sogar noch einfacher, einen arithmetischen Ausdruck zu verwenden .-a
und-o
werden von der POSIX-Spezifikation als veraltet angesehen ; Verwenden Sie separate Tests in Kombination mit||
wie im Update.{}
sollte auch eine Gruppierung mit Subshells möglich sein.Sie können entweder
[[
oder ein((
Schlüsselwort verwenden. Wenn Sie ein[[
Schlüsselwort verwenden, müssen Sie Zeichenfolgenoperatoren wie-eq
,-lt
. Ich denke,((
ist am meisten für die Arithmetik bevorzugt, da Sie direkt Operatoren wie verwenden können==
,<
und>
.Mit
[[
OperatorMit
((
OperatorNicht verwenden
-a
oder-o
Operatoren Da es nicht tragbar ist.quelle
Bitte versuchen Sie Folgendes
quelle
( ... )
erstellt Unterschalen - viele Auswirkungen auf die Leistung ohne Nutzen.{ ...; }
für ohne Subshell Erstellung gruppieren.Sie können sich inspirieren lassen, indem Sie ein
entrypoint.sh
Skript lesen, das von den Mitwirkenden von MySQL geschrieben wurde und prüft, ob die angegebenen Variablen festgelegt wurden.Wie das Skript zeigt, können Sie sie mit folgenden
-a
Punkten versehen: z.quelle
-a
ist in der aktuellen Version des POSIX-test
Standards als veraltet markiert ; Siehe dieOB
Markierungen unter pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Verwenden Sie[ -z "$FOO" ] && [ -z "$BAR" ]
diese Option , um einen zuverlässigeren Code zu erhalten.