Wenn ich Befehle in meiner Shell wie folgt ausführe, wird ein expr: non-integer argument
Fehler zurückgegeben. Kann mir bitte jemand das erklären?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Wenn ich Befehle in meiner Shell wie folgt ausführe, wird ein expr: non-integer argument
Fehler zurückgegeben. Kann mir bitte jemand das erklären?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Antworten:
Diese Variablen sind Shell-Variablen. Um sie als Parameter für ein anderes Programm ( dh expr
) zu erweitern, müssen Sie das $
Präfix verwenden:
expr $x / $y
Der Grund, warum es sich beschwert hat, ist, dass es dachte, Sie wollten mit alphabetischen Zeichen ( dh nicht ganzzahligen Zeichen ) arbeiten.
Wenn Sie die Bash-Shell verwenden, können Sie mit der Ausdruckssyntax dasselbe Ergebnis erzielen:
echo $((x / y))
Oder:
z=$((x / y))
echo $z
man bash
an der Eingabeaufforderung ( q
zum Beenden)
Ich glaube, es wurde bereits in anderen Threads erwähnt:
calc(){ awk "BEGIN { print "$*" }"; }
dann können Sie einfach eingeben:
calc 7.5/3.2
2.34375
In Ihrem Fall wird es sein:
x=20; y=3;
calc $x/$y
oder wenn Sie es vorziehen, fügen Sie dies als separates Skript hinzu und stellen Sie es in $ PATH zur Verfügung, damit Sie es immer in Ihrer lokalen Shell haben:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Warum nicht let verwenden? Ich finde es viel einfacher. Hier ist ein Beispiel, das Sie vielleicht nützlich finden:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Ein weiteres einfaches Beispiel: Berechnen Sie die Anzahl der Tage seit 1970:
let days=$(date +%s)/86400
Die Standard-Shell bei den meisten Linux-Distributionen ist Bash. In Bash müssen Variablen ein Dollarzeichenpräfix für die Parametererweiterung verwenden . Beispielsweise:
x=20
y=5
expr $x / $y
Natürlich verfügt Bash auch über arithmetische Operatoren und eine spezielle arithmetische Erweiterungssyntax , sodass die expr- Binärdatei nicht als separater Prozess aufgerufen werden muss. Sie können die Shell die ganze Arbeit so machen lassen:
x=20; y=5
echo $((x / y))
expr
wird 2013 nicht
Gesetzt den Fall
x=50
y=5
dann
z=$((x/y))
Dies wird ordnungsgemäß funktionieren. Wenn Sie jedoch / operator in case-Anweisungen verwenden möchten, kann dies nicht behoben werden. Verwenden Sie in diesem Fall einfache Zeichenfolgen wie div oder devide oder etwas anderes. Siehe den Code
/
funktioniert gut als Shell-Case-Etikett. Was nicht funktioniert, ist die *
Multiplikation, ohne sie zu zitieren. Dies könnte das sein, was Sie tatsächlich getan haben. dass Ursachen es effektiv alle folgenden Elemente im Fall außer Kraft zu setzen, die in Ihrem Beispiel ist ‚Divide‘ und ‚Modulo‘
Um die Zahlen nach dem Dezimalpunkt zu erhalten, können Sie Folgendes tun: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div