name=Jackson
echo $name
Dies zeigt Jackson an.
name="Jackson"
echo $name
Dies zeigt auch Jackson an.
Ich gehe also davon aus, dass durch Setzen von Anführungszeichen um eine Variable eine Zeichenfolge erstellt wird. Was wäre der Name = Jackson technisch? Würde es auch als String erkannt werden?
name=Michael Jackson ; echo "$name"
undname="Michael Jackson" ; echo "$name"
. Sehr verschieden. Setzen Sie normalerweise immer umgebende Anführungszeichen, wenn Sie Variablen definieren und verwenden.cd "${var}"
ist viel besser alscd $var
das, was stillschweigend zum Homedir gehen würde, anstatt zu protestieren, wenn var nicht definiert ist ... Es sei denn, Sie müssen jedes einzelne Element explizit aufrufen, dh in afor i in $var ; do something ; done
name=Michael Jackson ;
Sie setzen eine Variable "name" auf einen Wert "Michael" und rufen ein Programm / cmd "Jackson" auf. Bash wird einen Fehler mit der Meldung "Befehl nicht gefunden" erneut abstimmen, da bash nach einem Programm namens "Jackson" sucht. Am Ende ist die Variable "Name" also nicht gesetzt.Antworten:
Linux-Umgebungsvariablen sind immer Zeichenfolgen. Die Anführungszeichen werden nur benötigt, wenn Ihre Zeichenfolge Sonderzeichen (Shell-Metazeichen oder Leerzeichen) enthält. Shell-Metazeichen sind:
Mit $, \ und `reichen die doppelten Anführungszeichen nicht aus, da sie sogar in ihnen erweitert werden. Dort benötigen Sie entweder einfache Anführungszeichen oder maskieren sie mit \.
Wie in einem Kommentar erwähnt, hat bash spezielle typisierte Variablen, die jedoch selten benötigt werden. Standardmäßig sind alle bash-Variablen auch Zeichenfolgen.
quelle
typeset -i foo=2
eine Ganzzahlvariable$foo
mit dem Wert abrufen2
.foo=2
?typeset -i foo=2
ist genau das gleiche wiefoo=2
undfoo="2"
.foo=0x${foo}; echo $foo"
oderfoo=bar;echo $foo
sehen Sie einen Unterschied im Verhalten. Es gibt definitiv ganzzahlige Variablen in bash.declare -i x=123456789012345678901234567890;echo ${#x}
würde anzeigen,30
wenn das wahr wäre, aber das ist nicht der Fall.Bash ist nicht stark typisiert; 1 Der einzige signifikante Unterschied besteht zwischen skalaren und zusammengesetzten Typen (Arrays). Skalare werden immer als Zeichenfolgen betrachtet , aber es gibt "numerische Zeichenfolgen", die arithmetisch verwendet werden können:
Eine "numerische Zeichenfolge" ist einfach eine Zeichenfolge, die nur Ziffern enthält und daher in einen ganzzahligen Wert konvertiert werden kann. Alle Skalarwerte in bash sind immer noch nur Zeichenfolgen, und die Anführungszeichen in der Deklaration hier sind irrelevant.
a=5
ist genau das gleiche wiea="5"
. Wenn Sie vergleichen$a
und$b
verwenden (z. B.)-lt
, werden sie als Zahlen behandelt. Wenn Sie sie mit vergleichen, werden<
sie lexikographisch behandelt. Es ist der Operator / Kontext, der die Bestimmung vornimmt, kein Merkmal der Variablen.Sie können eine Variable auch mit einem "Integer-Flag" deklarieren. Dadurch wird der deklarierte Wert als arithmetischer Ausdruck interpretiert:
Anschließend wird alles, was dieser Variablen zugewiesen ist, arithmetisch interpretiert:
Der Inhalt der Variablen ist jedoch immer noch eine (numerische) Zeichenfolge. Das Integer-Flag schränkt den Inhalt der Zeichenfolge ein und wirkt sich auf die Interpretation der ihm zugewiesenen Werte aus.
1 Es ist auch keine einfache dynamische Eingabe, wie der Fall der deklarierten Ganzzahl zeigt. Vielleicht könnten wir es eine Art Enten-Typisierung nennen , oder es ist gemäß dem Bash Advanced Scripting Guide "untypisiert".
quelle
Es gibt einen Unterschied: versuchen Sie es
und
Es ist ganz anders: Am 2. wird versucht, den Befehl "Jackson" zu starten und ihm die Umgebung "name = Michael" zu übergeben. Es wird sich also beschweren, dass "Jackson: Befehl nicht gefunden" Ich muss den
unset name
Namen "Zurücksetzen" hinzufügen , da dername=Michael
Teil der nächsten Zeile nur an den Befehl "Jackson" (und nur an diesen Befehl) übergeben wird und daher NICHT ist auf der aufrufenden Shell-Ebene erledigt! (was daher immer noch denname="Michael Jackson"
Befehl vom 1. Befehl haben würde, wenn wir ihn nicht""
vor unserem 2. Versuch zurücksetzen würden. Der "echo $ name" würde also verwirrenderweise immer noch "Michael Jackson" anzeigen, wenn wir diesen 1. Versuch nicht vergessen würden .)In gewohnt, immer setzen doppelte Anführungszeichen umgeben , wenn Sie definieren, und vor allem , wenn Sie Variablen verwenden.
ist viel besser als
Die 2. Version würde stillschweigend zum Homedir gehen, anstatt zu protestieren, wenn $ var nicht definiert ist ...
Dann nehmen Sie nur aus den umliegenden doppelten Anführungszeichen nur , wenn Sie wissen , dass Sie benötigen jeweils Elemente der variablen, dh in einem trennen:
quelle