Shell-Skript, wenn sonst

2
#!/bin/bash
echo "Int. a number"
read num1
echo "Int. another numer"
read num2
if ["$num1"="$num2"]; then
echo "Equals"
else
echo "Dif"
fi
if["$num1"<0]; then
echo "The number $num1 is negative"
else if ["$num2"<0]; then
echo "The number $num2 is negative"
fi
#

Dieser Code funktioniert nicht. Ich habe etwas falsch gemacht, wenn ich sehe, ob die Zahl & lt; 0.

Vielen Dank

user34104
quelle

Antworten:

5

Falsche Syntax. Bitte lesen Sie die Dokumentation zum [ Befehl ( help [ / help test )

Jedes Argument muss ein eigenes Argument sein, dh Sie müssen Leerzeichen dazwischen verwenden: [ "$num1" == "$num2" ]. Der Grund, warum Sie bei der ersten Überprüfung keinen Fehler sehen, ist, dass versucht wird, einen Befehl mit dem Namen (mit num1 = 3 und num2 = 4) zu finden. [3==4]Wenn dies nicht der Fall ist, wird der Ausdruck mit false ausgewertet. Bei der ersten Prüfung haben Sie einen <, das ist ein Shell-Operator für Eingabeumleitung . Es wird versucht, die Datei zu öffnen 4], was in den meisten Fällen nicht existiert.

Beim Vergleichen von Zahlen sollten Sie jedoch verwenden -eq und ähnliches, == dient zum Vergleich von Zeichenfolgen: [ 3 == 3.0 ] ist falsch, [ 3 -eq 3.0 ] ist wahr.

Marian
quelle
3
-eq, -ne, -lt, -gt, -le, -ge. siehe die bash manpage, abschnitt "Bedingte Ausdrücke"
quack quixote
3

In Bash können Sie numerische Vergleiche mit den bekannten Operatoren durchführen, wenn Sie die arithmetische Auswertung verwenden:

if ((num1 ==num2 ))

if ((num1<0))    # in this context, < is not evaluated as a redirection operator

else if (( $num2 < 0 ))

Wie Sie sehen, war ich mit der Verwendung von Leerzeichen ziemlich frei und kann das Dollarzeichen weglassen, wenn ich möchte. Sie sollten sich jedoch dessen bewusst sein:

a=    # set to nothing, thus null
if (( a == 0 )); then echo "ok"; fi    # echoes "ok" since a evaluates to 0
if (( $a == 0 )); then echo "ok"; fi    # produces an error even if $a is quoted

Zeichenfolgenvergleiche können mit "& lt;" und "& gt;" anstelle von "-lt" und "-gt", wenn Sie doppelte eckige Klammern verwenden. Die Anforderung an Leerzeichen ist bei ihnen die gleiche wie bei einzelnen eckigen Klammern.

s="b"
if [[ "$s" > "a" ]]
t=    # null
if [[ $t < "a" ]]    # evaluates to true

Wie Sie im letzten Beispiel sehen können, ist es bei der Verwendung von doppelten eckigen Klammern nicht erforderlich, Variablen in Anführungszeichen zu setzen, um zu verhindern, dass sie null oder nicht gesetzt sind, im Gegensatz zu einfachen eckigen Klammern.

Dennis Williamson
quelle
2

Die von Ihnen verwendeten Operatoren führen einen Zeichenfolgenvergleich durch. Sie sollten -eq für ganzzahlige Gleichheit, -lt für weniger als usw. verwenden (sie sollten auch von Leerzeichen umgeben sein).

Brian
quelle