Wenn ich in Bash eine Zuweisung vornehme,
a=
Was ist a
jetzt? Ich bin sicher, dass a weder ''
eine Zeichenfolge noch ein ist 0
.
Ich habe festgestellt, dass nur der folgende Test zutrifft
if [ $a = ];then echo 'good';fi
Antwort1
Es ist die leere Zeichenfolge.
Dies ist dasselbe wie Folgendes zu tun:
a=''
Oder
a=""
Oder
a=$''
Oder was das betrifft:
a=''""$''
Diese ''
, ""
, und $'...'
sind Anführungszeichen-Operatoren für die Shell. Wenn Sie dies tun:
a=''
Sie weisen keinen String aus zwei einfachen Anführungszeichen zu, $a
sondern den leeren String. Diese ''
sind überflüssig, da sie nichts enthalten, aber das kann Ihren Code etwas lesbarer machen (um deutlicher zu machen, dass Sie tatsächlich einen leeren String zuweisen wollten).
Um ein Literal zuzuweisen ''
, $a
müssen Sie diese Sonderzeichen in Anführungszeichen setzen, wie:
a="''" a=\'\' a=$'\'\'' a="'"\'
Ihr Testbefehl ist ungültig.
[ $a = ]
Da Sie vergessen haben, Anführungszeichen zu setzen $a
, wird der Operator split+glob auf angewendet $a
. Da $a
leer ist (was aber dasselbe wäre, wenn es nur Leerzeichen oder Zeilenumbrüche mit dem Standardwert enthielte $IFS
), wird dem Befehl kein Argument übergeben [
.
Alle empfangenen Argumente [
sind also [
, =
und ]
. Für [
ist dies ein Test, um festzustellen, ob =
es sich um eine nicht leere Zeichenfolge handelt, und er gibt „true“ zurück.
Hier möchten Sie dem [
Befehl folgende Argumente übergeben:
[
- deren Inhalt
$a
Sie benötigen"$a"
=
- die leere Zeichenfolge. Für die Sie
''
oder""
... benötigen. Nichts zu übergeben würde bedeuten, dass kein Argument übergeben wird,[
sodass das vierte Argument das schließende wäre]
. ]
So sollte es sein:
if [ "$a" = '' ]; then echo '$a is empty'; fi
Oder:
if [ -z "$a" ]; then echo '$a is empty'; fi
Antwort2
Die Variable a ist gleich einer leeren Zeichenfolge.
a=
if [ "$a" -eq "" ]; then echo 'good'; fi
Die Ausgabe lautet:
$ . tst.sh
good
Und für diesen Code:
a=
if [ -z "$a" ]; then echo 'good'; fi
Die Ausgabe ist die gleiche.