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:
a="5"
b=10
echo "$a + $b = "$(($a+$b));
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 wie a="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:
x=10/2
echo "$x" # output: 10/2
declare -i x=10/2
echo "$x" # output: 5
declare -i x=what
echo "$x" # output: 0
Anschließend wird alles, was dieser Variablen zugewiesen ist, arithmetisch interpretiert:
a=5
declare -i b=10
a=$a/5
b=$b/5
echo "$a $b" #output: 5/5 2
a=hello
b=world
echo $a$b #output hello0
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".
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