Naubaddi schrieb:
bei SelfLinux steht man soll für Bedingung1 und (oder) Bedingung2 "-a für und" und "-o für oder" benutzen.
Es hängt von der Situation ab (s.u.).
Shellcheck ist da anderer Meinung,
| if [ "$nr" != "0" -o "$nr" != "1" ] ; then
^-- SC2055: You probably wanted -a here.
^-- SC2166: Prefer [ p ] || [ q ] as [ p -o q ] is not well defined.
|
Die Meldung SC2055 bezieht sich ja nur darauf, dass die Verknüpfung mit ODER hier nicht so sinnvoll ist. Geschenkt.
Ich habe mir mal die Begründung angeschaut und kann das durchaus nachvollziehen. Ich persönlich nutze die Form mit Shell-Meta-Zeichen, wenn eines oder mehrere der Argumente im hinteren Ausdruck länger für die Auswertung brauchen; dann kann es sinnvoll sein test x && test y
zu schreiben statt test x -a y
(wobei "x" und "y" boolsche Ausdrücke sind. Oft sieht man ja auch Vergleiche wie diesen hier, die die genannten Probleme vermeiden, weil der Präfix festgeklopft wird:
| if [ "@$foo" = @bar ]; then ...
|
Moderne Shells sind aber recht tolerant gegen Ausdrücke, die "!" oder "-" beinhalten:
| $ sh -c 'if [ ! = foo ]; then echo ja; else echo nein; fi'
nein
$ sh -c 'if [ -a = foo ]; then echo ja; else echo nein; fi'
nein
$ sh -c 'if [ -a = -a ]; then echo ja; else echo nein; fi'
ja
$ sh -c 'if [ ! = ! ]; then echo ja; else echo nein; fi'
ja
|
was ist jetzt richtig -a oder &&, -o oder || ?
Beide Paare werden in unterschiedlichen Kontexten benutzt. "-a" und "-o" werden für Bedingungen innerhalb einer test
-Argumentliste (bzw. [
-Argumentliste) benutzt, während &&
und ||
Shell-Meta-Zeichen sind, die die Ergebnisse zweier Prozesse verknüpfen.
fleet_street schrieb:
Probier mal folgendes, das wird nicht beanstandet:
| if [ "$nr" != "0" ] -a [ "$nr" != "1" ] ; then
|
Das funktioniert nicht:
1
2
3
4
5
6
7
8
9
10
11
12
13 | $ cat x
if [ "$nr" != "0" ] -a [ "$nr" != "1" ] ; then
echo ja
else
echo nein
fi
$ sh x
x: 1: [: 0: unexpected operator
nein
$ bash x
x: line 1: [: too many arguments
nein
|
Statt "-a" muss da &&
stehen. Abgesehen davon würde ich wohl in diesem Fall den numerischen Vergleich mit "-eq" und "-ne" nutzen.