Bash: Was ist die Zuweisung „a=“?

Bash: Was ist die Zuweisung „a=“?

Wenn ich in Bash eine Zuweisung vornehme,

a=

Was ist ajetzt? 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, $asondern 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 '', $amü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 $aleer 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:

  1. [
  2. deren Inhalt $aSie benötigen"$a"
  3. =
  4. 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 ].
  5. ]

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.

verwandte Informationen