![Bash: ganzzahliger Ausdruck erwartet, mit Lesen/Test](https://rvso.com/image/23940/Bash%3A%20ganzzahliger%20Ausdruck%20erwartet%2C%20mit%20Lesen%2FTest.png)
Ich lerne die Grundlagen der Shell-Programmierung, also habe ich etwas Einfaches geschrieben wie
#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
echo "var1 is lt var2"
else
echo "var2 is lt var1"
fi
Nach meinem Verständnis sind Variablen in Bash untypisiert und jede Variable kann als Ganzzahl verwendet werden, wenn sie nur Ziffern enthält. Aber ich erhalte die Fehlermeldung „Ganzzahliger Ausdruck erwartet“, wenn ich dies ausführe … warum?
Antwort1
declare
Tatsächlich können Sie mithilfe der (oder der alten typeset
) integrierten Funktion einige Attribute für Variablen festlegen . declare -i var1 var2
legt für diese Variablen ganzzahlige Attribute fest. Danach führen Zuweisungen, die versuchen, diesen Variablen nicht ganzzahlige Werte zuzuweisen, zu einem Fehler.
Ihr Problem betrifft jedoch die Syntax. Wenn Sie den Wert einer Variablen verwenden, müssen Sie ihrem Namen Folgendes voranstellen $
:
if [ "$var1" -lt "$var2" ]; then
echo "$var1 is lt $var2"
else
echo "$var2 is lt $var1"
fi
Ausnahmen sind die arithmetischen Auswertungen, bei denen Folgendes nicht erforderlich ist $
:
if ((var1<var2)); then
echo "$var1 is lt $var2"
else
echo "$var2 is lt $var1"
fi
Als Warnung: Setzen Sie Ihre Variablen innerhalb von [
.. ]
immer in doppelte Anführungszeichen, um zu vermeiden, dass die Worterweiterung die Syntax Ihres Ausdrucks durcheinander bringt. (Ich meine, Sie werden Probleme mit nicht gesetzten Variablen, Variablen, die leere Zeichenfolgen enthalten, und Variablen, die IFS
Zeichen enthalten, haben.) Oder Sie können stattdessen das neuere und bessere [[
.. verwenden ]]
, das solche Fälle korrekt behandelt:
if [[ $var1 -lt $var2 ]]; then
echo "$var1 is lt $var2"
else
echo "$var2 is lt $var1"
fi
Antwort2
Sie sollten Variablen referenzieren, indem Sie dem Namen Folgendes voranstellen:$
if [ $var1 -lt $var2 ] ; then...