Versuchen Sie herauszufinden, wie Sie ein Argument in eine Ganzzahl konvertieren, um eine Arithmetik auszuführen, und drucken Sie es dann aus, beispielsweise für addOne.sh
:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
Versuchen Sie herauszufinden, wie Sie ein Argument in eine Ganzzahl konvertieren, um eine Arithmetik auszuführen, und drucken Sie es dann aus, beispielsweise für addOne.sh
:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
Antworten:
In der Bash konvertiert man kein Argument in eine Ganzzahl, um eine Arithmetik durchzuführen. In der Bash werden Variablen je nach Kontext als Ganzzahl oder Zeichenfolge behandelt.
Um Arithmetik auszuführen, sollten Sie den arithmetischen Expansionsoperator aufrufen $((...))
. Zum Beispiel:
$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
oder allgemein bevorzugt:
$ echo "$((a + 1))"
3
Sie sollten sich bewusst sein, dass bash (im Gegensatz zu ksh93, zsh oder yash) nur Ganzzahlarithmetik ausführt . Wenn Sie Gleitkommazahlen (Zahlen mit Dezimalstellen) haben, gibt es andere Hilfsmittel. Verwenden Sie zum Beispiel bc
:
$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14
Oder Sie können eine Shell mit Gleitkomma-Unterstützung anstelle von bash verwenden:
zsh> echo $((3.14 + 1))
4.14
In bash
können Sie die Konvertierung von irgendetwas in eine Ganzzahl mit printf -v durchführen :
printf -v int '%d\n' "$1" 2>/dev/null
Gleitende Zahlen werden in Ganzzahlen umgewandelt, während alles, was nicht wie eine Zahl aussieht, in 0 umgewandelt wird. Die Potenzierung wird auf die vorhergehende Zahl abgeschnitten e
Beispiel:
$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
printf -v
kann dies durch Befehlsersetzung erreicht werden:int="$(printf '%d' 123.123 2>/dev/null)"
bash
hast du benutzt?
Eine ähnliche Situation ergab sich kürzlich bei der Entwicklung von Bash-Skripten für Linux- und OSX-Umgebungen. Das Ergebnis eines Befehls in OSX gab eine Zeichenfolge mit dem Ergebniscode zurück. dh " 0"
. In folgendem Fall konnte dies natürlich nicht richtig getestet werden:
if [[ $targetCnt != 0 ]]; then...
Die Lösung bestand darin, das Ergebnis in eine Ganzzahl umzuwandeln, ähnlich der Antwort von @ John1024, damit es wie erwartet funktioniert:
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
==
etc in [[
(auch [
aka test
) tun Stringvergleich. Es gibt verschiedene Operatoren für den arithmetischen Vergleich, z [[ $targetcnt -ne 0 ]]
. Siehe Hilfeseite (oder Info) unter Bedingte Ausdrücke. Um Leerzeichen spezifisch zu trimmen, können Sie [
mit der nicht [ $targetcnt == 0 ]
zitierten Variablenerweiterung die Standard-Worttrennung (NICHT in [[
) verwenden, aber im Allgemeinen führt Sie dieser Ansatz in Gefahr.
Wenn Sie sich um Farbcodes kümmern, selbst wenn trace ( -x
) nicht angezeigt wird, wird die Zeichenfolge, die eine Zahl sein soll, in Anführungszeichen gesetzt, unabhängig davon, wie Sie sie drucken.
$((var+var))
Fail Even (Selbst fehlschlagen) Wenn Sie echo
oder printf
beide Vars gleich sind. Ich kenne das Update nicht, da ich es nur durch Deaktivieren der Farbcodes an der Quelle der Ausgabe beheben konnte. Um es in den Ablaufverfolgungsprotokollen zu erkennen, wird die beleidigende Variable so var='0'
var=0
sed
wenn Sie sie nicht deaktivieren können
printf "1 + %s\n" $1 won't do ?