Gibt es einen Unix-Befehl, der das Minimum / Maximum von zwei Zahlen ergibt?

37

Ich suchte nach einem Befehl, um die Anzahl der eingelesenen Nummern zu begrenzen stdin.

Zu diesem Zweck habe ich ein kleines Skript geschrieben (Kritik ist willkommen), aber ich habe mich gefragt, ob es keinen Standardbefehl für diesen einfachen und (wie ich finde) allgemeinen Anwendungsfall gibt.

Mein Skript, das mindestens zwei Zahlen findet:

#!/bin/bash
# $1 limit

[ -z "$1" ] && { echo "Needs a limit as first argument." >&2; exit 1; }

read number

if [ "$number" -gt "$1" ]; then
        echo "$1"
else
        echo "$number"
fi
Minix
quelle

Antworten:

20

Sie können nur zwei Zahlen mit " dcGefällt mir" vergleichen :

dc -e "[$1]sM $2d $1<Mp"

... wo "$1"ist dein Maximalwert und "$2"ist die Zahl, die du drucken würdest, wenn sie kleiner ist als "$1". Das erfordert auch GNU dc- aber Sie können dasselbe portabel machen wie:

dc <<MAX
    [$1]sM $2d $1<Mp
MAX

In beiden oben genannten Fällen können Sie die Präzision auf etwas anderes als 0 gesetzt (Standardeinstellung) wie ${desired_precision}k. Für beide ist es auch zwingend notwendig , dass Sie sicherstellen , dass beide Werte sind definitiv Zahlen , weil dckönnen machen system()Anrufe w / der !Betreiber.

Mit dem folgenden kleinen Skript (und dem nächsten) sollten Sie auch die Eingabe überprüfen - wie grep -v \!|dcoder so etwas, um willkürliche Eingaben sicher zu handhaben. Sie sollten auch wissen, dass dcnegative Zahlen _eher mit einem Präfix als mit einem Präfix interpretiert werden, -da letzteres der Subtraktionsoperator ist.

Abgesehen davon dcliest dieses Skript so viele fortlaufende \newline-getrennte Zahlen ein, wie Sie bereitstellen möchten, und druckt für jeden $maxWert oder für jede Eingabe, je nachdem, welche die kleinere der beiden ist:

dc -e "${max}sm
       [ z 0=? d lm<M p s0 lTx ]ST
       [ ? z 0!=T q ]S?
       [ s0 lm ]SM lTx"

So ... jedes dieser [quadratischen klammert ]Weiten ist ein dc String - Objekt , das sich Sjeweils an seinem jeweiligen Array Aved - einem der T, ?, oder M. Neben ein paar anderen Dingen, dcdie mit einer Zeichenfolge zu tun haben , kann sie auch xals Makro ausgeführt werden. Wenn Sie es richtig anordnen, wird ein voll funktionsfähiges kleines dcSkript einfach genug zusammengestellt.

dcarbeitet auf einem Stapel . Alle Eingabeobjekte werden nacheinander gestapelt - jedes neue Eingabeobjekt schiebt das letzte obere Objekt und alle Objekte darunter beim Hinzufügen um eins nach unten auf den Stapel. Die meisten Verweise auf ein Objekt sind auf dem oberen Stapelwert und die meisten Referenzen Pop , dass oben auf dem Stack (die durch eine alle Objekte darunter nach oben zieht) .

Neben dem Hauptstapel gibt es (mindestens) 256 Arrays, und jedes Array-Element verfügt über einen eigenen Stapel. Davon verwende ich hier nicht viel. Ich speichere nur die Saiten wie erwähnt , so kann ich lsie oad wenn wollte und e xsie ecute bedingt, und ich sriss $max‚s - Wert in der Spitze des mArrays.

Wie auch immer, dieses kleine bisschen dcmacht im Großen und Ganzen das, was Ihr Shell-Skript macht. Es verwendet die GNU-ism- -eOption, die im dcAllgemeinen die Standard-In-Parameter verwendet, aber Sie können das Gleiche tun wie:

echo "$script" | cat - /dev/tty | dc

... wenn es $scriptso aussieht.

Es funktioniert wie folgt:

  • lTx- Dies llädt und xführt das Makro aus, das oben in gespeichert ist T (zum Test, denke ich - ich wähle diese Namen normalerweise willkürlich aus) .
  • z 0=?- Test testet dann die Stapeltiefe mit zund ruft das Makro auf , wenn der Stapel leer ist (read: enthält 0 Objekte)? .
  • ? z0!=T q- Das ?Makro ist nach dem ? dceingebauten Befehl benannt, der eine Eingabezeile aus stdin liest, aber ich habe ihm auch einen weiteren zStapeltiefen-Test hinzugefügt , damit es qdas ganze kleine Programm beenden kann , wenn es eine leere Zeile einliest oder EOF drückt. Wenn dies jedoch !nicht der Fall ist und der Stapel stattdessen erfolgreich gefüllt wird, wird Test erneut aufgerufen.
  • d lm<M- Test dkopiert dann den oberen Teil des Stapels und vergleicht ihn mit $max (wie in gespeichert m) . Wenn mder kleinere Wert ist, wird dcdas MMakro aufgerufen.
  • s0 lm- MKnallt einfach die Oberseite des Stapels und wirft sie auf den Dummy-Skalar. 0- Nur eine billige Art, den Stapel zu knallen. Es wird auch wieder lgeladen m, bevor zu Test zurückgekehrt wird.
  • p- Dies bedeutet, dass wenn mkleiner als die aktuelle Stapelspitze ist, diese mersetzt wird ( djedenfalls das Uplikat davon) und hier pgedruckt wird, andernfalls wird sie nicht gedruckt, und was auch immer die Eingabe war, wird pstattdessen gedruckt.
  • s0- Danach (weil pder Stapel nicht aufgeht) legen wir den oberen Teil des Stapels 0wieder ein und dann ...
  • lTx- erneut rekursiv lladen und Terneut xausführen.

Sie könnten also dieses kleine Snippet ausführen und interaktiv Zahlen an Ihrem Terminal eingeben und dcdann entweder die eingegebene Zahl oder den Wert für $maxden Fall, dass die eingegebene Zahl größer ist, zurückgeben. Es würde auch jede Datei (wie eine Pipe) als Standardeingabe akzeptieren . Die Lese- / Vergleichs- / Druckschleife wird fortgesetzt, bis eine leere Zeile oder ein EOF auftritt.

Einige Anmerkungen dazu - Ich habe dies geschrieben, um das Verhalten in Ihrer Shell-Funktion zu emulieren, sodass nur eine Zahl pro Zeile zuverlässig verarbeitet wird. dcEs können jedoch so viele durch Leerzeichen getrennte Zahlen pro Zeile verarbeitet werden, wie Sie darauf werfen möchten. Aufgrund seines Stapels ist jedoch die letzte Zahl in einer Zeile die erste, mit der er arbeitet, und daher dcwürde die Ausgabe , wie beschrieben, in umgekehrter Reihenfolge gedruckt, wenn Sie mehr als eine Zahl pro Zeile gedruckt / eingegeben haben um das zu handhaben, muss man eine Zeile in einem Array speichern und dann bearbeiten.

So was:

dc -e "${max}sm
    [ d lm<M la 1+ d sa :a z0!=A ]SA
    [ la d ;ap s0 1- d sa 0!=P ]SP 
    [ ? z 0=q lAx lPx l?x ]S?
    [q]Sq [ s0 lm ]SM 0sa l?x"

Aber ... ich weiß nicht, ob ich das so ausführlich erklären möchte. Es genügt zu sagen, dass beim dcEinlesen jedes Werts im Stapel entweder der Wert oder der Wert des Stapels $maxin einem indizierten Array gespeichert wird. Sobald festgestellt wird, dass der Stapel wieder leer ist, wird jedes indizierte Objekt gedruckt, bevor versucht wird, ein anderes zu lesen Eingabezeile.

Und so, während das erste Skript tut ...

10 15 20 25 30    ##my input line
20
20
20
15
10                ##see what I mean?

Der zweite macht:

10 15 20 25 30    ##my input line
10                ##that's better
15
20
20                ##$max is 20 for both examples
20

Sie können mit Gleitkommazahlen beliebiger Genauigkeit umgehen, wenn Sie sie zuerst mit dem kBefehl festlegen . Und Sie können die input- oder output-Radices unabhängig voneinander ändern - was manchmal aus Gründen nützlich sein kann, die Sie vielleicht nicht erwarten. Beispielsweise:

echo 100000o 10p|dc
 00010

... der zuerst dcden Ausgaberadix auf 100000 setzt und dann 10 ausgibt.

mikeserv
quelle
3
+1, weil Sie keine Ahnung haben, was gerade passiert ist, nachdem Sie es zweimal gelesen haben. Ich werde mir Zeit nehmen müssen, um mich damit zu beschäftigen.
Minix
@Minix - meh - Sie müssen sich nicht in die älteste Unix-Programmiersprache vertiefen, wenn Sie dies für verwirrend halten. Vielleicht nur ab und zu ein paar Zahlen dc, um es auf Trab zu halten.
mikeserv
1
@mikeserv Es ist zu spät für mich. Ich hoffe, die zukünftige Generation nimmt meine Geschichte als warnend. Eckige Klammern und Buchstaben überall ...
Minix
@Minix - was meinst du? Du hast es versucht? Sehr gut - dcist ein launisches Biest, aber es ist vielleicht das schnellste und seltsamste gemeinsame Dienstprogramm auf jedem Unix-System. Wenn es gepaart wird sed, kann es einige außergewöhnliche Dinge bewirken. Ich habe damit gespielt und in ddletzter Zeit, damit ich die Monstrosität, die es gibt, ersetzen kann readline. Hier ist eine kleine Auswahl von Dingen, die ich gemacht habe. Ein Tun revin dcSpielend fast Kind.
mikeserv
1
@Minix - Vorsicht mit den Klammern. Es gibt keine Möglichkeit, eine eckige Klammer in eine Zeichenfolge einzufügen - das Beste, was Sie tun können, ist [string]P91P93P[string]P. Also habe ich dieses kleine bisschen von sedIhnen vielleicht nützlich gefunden: Das sed 's/[][]/]P93]&[1P[/g;s/[]3][]][[][1[]//g'sollte die Quadrate immer korrekt durch eine Klammer zum Schließen des Strings ersetzen, dann a P, dann der Dezimal-Ascii-Wert des Quadrats und ein anderer P; dann eine offene [eckige Klammer, um die Zeichenfolge fortzusetzen. Keine Ahnung, ob Sie die dcString / Numeric-Konvertierungsfunktionen von w / durcheinandergebracht haben, aber - besonders wenn Sie mit w / kombiniert werden od- es kann ziemlich lustig sein.
mikeserv
88

Wenn Sie wissen , dass Sie mit zwei ganzen Zahlen zu tun aund bdann diesen einfachen Shell arithmetische Erweiterungen des ternären Operator ausreichen , um den numerischen max zu geben:

$(( a > b ? a : b ))

und numerische min:

$(( a < b ? a : b ))

Z.B

$ a=10
$ b=20
$ max=$(( a > b ? a : b ))
$ min=$(( a < b ? a : b ))
$ echo $max
20
$ echo $min
10
$ a=30
$ max=$(( a > b ? a : b ))
$ min=$(( a < b ? a : b ))
$ echo $max
30
$ echo $min
20
$ 

Hier ist ein Shell-Skript, das dies demonstriert:

#!/usr/bin/env bash
[ -z "$1" ] && { echo "Needs a limit as first argument." >&2; exit 1; }
read number
echo Min: $(( $number  < $1 ? $number : $1 ))
echo Max: $(( $number  > $1 ? $number : $1 ))
Digitales Trauma
quelle
Gute Antwort. Bitte ein kleiner Mod: Könnte dies auch für "> =" verwendet werden?
Sopalajo de Arrierez
@SopalajodeArrierez Ich bin nicht ganz sicher, was du meinst. Sie können dies auch tun max=$(( a >= b ? a : b )), aber das Ergebnis ist völlig dasselbe - wenn a und b gleich sind, spielt es keine Rolle, welches Ergebnis zurückgegeben wird. Ist es das, was du fragst?
Digitales Trauma
In der Tat, danke, digitales Trauma. Ich habe mich nur gefragt, ob der Boolesche Operator "> =" hier möglich ist.
Sopalajo de Arrierez
@SopalajodeArrierez if (( a >= b )); then echo a is greater than or equal to b; fi- ist es das, wonach du fragst ? (Beachten Sie die Verwendung von (( ))hier anstelle von $(( )))
Digital Trauma
Ach ja ok Ich verstehe jetzt. Ich weiß nicht viel über Shell-Expansion, daher verwechsle ich normalerweise die Bedingungen. Nochmals vielen Dank.
Sopalajo de Arrierez
25

sortund headkann dies tun:

numbers=(1 4 3 5 7 1 10 21 8)
printf "%d\n" "${numbers[@]}" | sort -rn | head -1       # => 21
Glenn Jackman
quelle
2
Beachten Sie, dass dies O(n log(n))zwar eine effiziente Implementierung von max wäre O(n). Es ist jedoch unsere geringe Bedeutung n=2, da das Laichen von zwei Prozessen viel mehr Aufwand bedeutet.
Lie Ryan
1
Es ist zwar wahr, @ glenn-jackman, aber ich bin mir nicht sicher, ob es in Anbetracht der Frage wichtig ist. Es gab keine Anfrage nach dem effizientesten Weg, dies zu tun. Ich denke, die Frage betraf mehr die Bequemlichkeit.
David Hoelzer
1
@DavidHoelzer - Dies ist nicht der effizienteste Weg, um dies zu tun, auch wenn hier Antworten angeboten werden. Wenn mit Zahlenmengen gearbeitet wird, gibt es hier mindestens eine andere Antwort, die effizienter ist (um Größenordnungen) , und wenn nur mit zwei ganzen Zahlen gearbeitet wird, gibt es hier eine andere Antwort, die effizienter ist (um Größenordnungen) . Es ist zwar praktisch (aber ich würde wahrscheinlich persönlich das Shell-Array weglassen) .
mikeserv
1
Dies kann wie folgt ohne Arrays durchgeführt werden:numbers="1 4 3 5 7 1 10 21 8"; echo $numbers | tr ' ' "\n" | sort -rn | head -n 1
ngreen
1
Ein effizienterer Ansatz ist wahrscheinlich folgender:max=0; for x in $numbers ; do test $x -gt $max && max=$x ; done
ngreen
6

Sie können eine Bibliothek vordefinierter mathematischer Funktionen für definieren bcund diese dann in der Befehlszeile verwenden.

Zum Beispiel ist die folgende in einer Textdatei wie ~/MyExtensions.bc:

define max(a,b){
  if(a>b)
  { 
   return(a)
  }else{
   return(b)
  }
}

Jetzt können Sie anrufen bcdurch:

> echo 'max(60,54)' | bc ~/MyExtensions.bc
60

Zu Ihrer Information, es gibt kostenlose mathematische Bibliotheksfunktionen wie diese, die online verfügbar sind.

Mit Hilfe dieser Datei können Sie leicht ausrechnen , kompliziertere Funktionen wie GCD:

> echo 'gcd (60,54)' | bc ~/extensions.bc -l
6
Ari
quelle
Wenn ich mich nicht irre, können solche Funktionen bei Bedarf auch mit der ausführbaren Datei kompiliert werden. Ich denke, die meisten bcsind nur dcFrontends bis zum heutigen Tag, auch wenn GNUbc nicht mehr so ​​ist (aber GNU dcund GNU bcteilen eine erstaunliche Menge ihrer Codebasis) . Auf jeden Fall könnte dies hier die beste Antwort sein.
mikeserv
Um dies bequem in der Datei eines Shell-Skripts aufzurufen, können Sie die Funktionsdefinition bcauch direkt vor dem Funktionsaufruf an leiten. Keine zweite Datei benötigt dann :)
Tanius
5

Zu lange für einen Kommentar:

Während Sie diese Dinge z. B. mit sort | headoder tun können sort | tail, scheint dies sowohl in Bezug auf Ressourcen als auch in Bezug auf die Fehlerbehandlung suboptimal zu sein. Bei der Ausführung bedeutet die Kombination, dass zwei Prozesse erzeugt werden, um nur zwei Zeilen zu überprüfen. Das scheint ein bisschen übertrieben zu sein.

Das ernstere Problem ist, dass Sie in den meisten Fällen wissen müssen, dass die Eingabe vernünftig ist, dh nur Zahlen enthält. @glennjackmanns Lösung löst dies geschickt, da printf %dauf Nicht-Ganzzahlen verzichtet werden sollte. Es funktioniert auch nicht mit Gleitkommazahlen (es sei denn, Sie ändern den Formatbezeichner in %f, wodurch Sie auf Rundungsprobleme stoßen).

test $1 -gt $2 zeigt an, ob der Vergleich fehlgeschlagen ist oder nicht (Exit-Status 2 bedeutet, dass während des Tests ein Fehler aufgetreten ist. Da dies normalerweise eine integrierte Shell ist, wird kein zusätzlicher Prozess erzeugt - wir sprechen von Hunderten mal schnellere Ausführung. Funktioniert jedoch nur mit ganzen Zahlen.

Wenn Sie zufällig ein paar Gleitkommazahlen vergleichen müssen, könnte die bcfolgende Option interessant sein :

define x(a, b) {
    if (a > b) {
       return (a);
    }
    return (b);
 }

wäre gleichbedeutend mit test $1 -gt $2und mit in in shell:

max () { printf '
    define x(a, b) {
        if (a > b) {
           return (a);
        }
        return (b);
     }
     x(%s, %s)
    ' $1 $2 | bc -l
}

ist immer noch fast 2,5 mal schneller als printf | sort | head(für zwei Nummern).

Wenn Sie sich auf GNU-Erweiterungen verlassen können bc, können Sie auch die read()Funktion verwenden, um die Zahlen direkt in das bcSkript einzulesen.

peterph
quelle
Genau meine Gedanken - ich habe das gerade ausgebügelt, aber du hast mich geschlagen: dc -e "${max}sm[z0=?dlm<Mps0lTx]ST[?z0!=Tq]S?[s0lm]SMlTx"- oh, außer das dcmacht das Ganze (außer das Echo, obwohl es das könnte) - es liest stdin und druckt entweder $maxoder die eingegebene Nummer, je nachdem welche ist kleiner. Wie auch immer, es ist mir eigentlich egal, und deine Antwort ist besser, als ich schreiben wollte. Also, bitte, hab mein Votum.
mikeserv
@mikeserv tatsächlich ein erklärtes dcSkript zu haben wäre wirklich nett, RPN wird heutzutage nicht mehr so ​​oft gesehen.
Peterph
Umgekehrte polnische Notation (auch bekannt als Postfix-Notation). Und wenn dcSie die E / A alleine ausführen können, ist sie noch eleganter als.
Peterph
4

Um den größeren Wert von $ a und $ b zu erhalten, verwenden Sie Folgendes:

[ "$a" -gt "$b" ] && $a || $b

Aber Sie brauchen etwas in der Nähe, wahrscheinlich wollen Sie die Zahl nicht ausführen, also verwenden Sie "echo", um den größeren Wert der beiden anzuzeigen.

[ "$a" -gt "$b" ] && echo $a || echo $b

Das obige passt gut in eine Shell-Funktion, z

max() {
   [ "$1" -gt "$2" ] && echo $1 || echo $2
}

Verwenden Sie diese geänderte Version, um die größere der beiden Variablen zuzuweisen:

[ "$a" -gt "$b" ] && biggest=$a || biggest=$b

oder benutze die definierte Funktion:

biggest=$( max $a $b )

Die Funktionsvariante gibt Ihnen auch die Möglichkeit, die Eingabefehlerprüfung übersichtlich hinzuzufügen.

Um das Maximum von zwei Dezimal- / Gleitkommazahlen zurückzugeben, können Sie verwenden awk

decimalmax() { 
   echo $1 $2 | awk '{if ($1 > $2) {print $1} else {print $2}}'; 
}

BEARBEITEN: Mit dieser Technik können Sie eine "Limit" -Funktion erstellen, die umgekehrt wie in Ihrer Bearbeitung / Notiz funktioniert. Diese Funktion gibt die niedrigere der beiden zurück, zB:

limit() {
   [ "$1" -gt "$2" ] && echo $2 || echo $1
}

Ich mag es, Utility-Funktionen in eine separate Datei zu packen, sie aufzurufen myprogram.funcsund in einem Skript wie folgt zu verwenden:

#!/bin/bash

# Initialization. Read in the utility functions
. ./myprogram.funcs

# Do stuff here
#
[ -z "$1" ] && { echo "Needs a limit as first argument." >&2; exit 1; }

read number
echo $( limit $1 $number )

FWIW dies macht immer noch das, was Sie getan haben, und Ihre Version ist genauso effizient, obwohl sie ausführlicher ist.

Die kompaktere Form ist nicht wirklich besser, verhindert jedoch Unordnung in Ihren Skripten. Wenn Sie viele einfache if-then-else-fi-Konstrukte haben, wird das Skript schnell erweitert.

Wenn Sie die Prüfung für größere / kleinere Zahlen mehrmals in einem einzelnen Skript verwenden möchten, fügen Sie sie in eine Funktion ein. Das Funktionsformat erleichtert das Debuggen und Wiederverwenden und ermöglicht das einfache Ersetzen dieses Teils des Skripts, beispielsweise durch einen awk-Befehl, um nicht ganzzahlige Dezimalzahlen verarbeiten zu können.

Wenn es sich um einen Einzelfall handelt, codieren Sie ihn einfach in der Zeile.

Johan
quelle
4

Sie können eine Funktion definieren als

maxnum(){
    if [ $2 -gt $1 ]
    then
        echo $2
    else
        echo $1
    fi
}

Nennen Sie es wie maxnum 54 42und es hallt 54. Sie können Validierungsinformationen in die Funktion einfügen (z. B. zwei Argumente oder Zahlen als Argumente), wenn Sie möchten.

entmutigen
quelle
Die meisten Shells führen keine Gleitkomma-Arithmetik durch. Aber es funktioniert für ganze Zahlen.
Orion
1
Diese Funktion ist nicht mit POSIX kompatibel. Wechseln Sie function maxnum {zu maxnum() {und es wird für viel mehr Muscheln funktionieren.
Charles Duffy
2

In einem Shell-Skript können Sie eine beliebige öffentliche statische Java-Methode (und beispielsweise Math.min () ) verwenden. Von Bash unter Linux:

. jsbInit
jsbStart 
A=2 
B=3 
C=$(jsb Math.min "$A" "$B")
echo "$C"

Dies erfordert Java Shell Bridge https://sourceforge.net/projects/jsbridge/

Sehr schnell, da die Methodenaufrufe werden intern geleitet ; Kein Prozess erforderlich.

Fil
quelle
0

Die meisten Leute würden nur tun sort -n input | head -n1(oder schwänzen), es ist gut genug für die meisten Skriptsituationen. Dies ist jedoch etwas umständlich, wenn Sie Zahlen in einer Zeile anstelle einer Spalte haben - Sie müssen sie in einem geeigneten Format ( tr ' ' '\n'oder ähnlichem) ausdrucken .

Shells sind nicht gerade ideal für die numerische Verarbeitung, aber Sie können ganz einfach ein anderes Programm aufrufen, das besser darin ist. Abhängig von Ihrer eigenen Präferenz können Sie maximal anrufen dc(etwas verschleiert, aber wenn Sie wissen, was Sie tun, ist das in Ordnung - siehe Antwort von mikeserv) oder awk 'NR==1{max=$1} {if($1>max){max=$1}} END { print max }'. Oder vielleicht perloder pythonwenn Sie es vorziehen. Eine Lösung (wenn Sie bereit sind, weniger bekannte Software zu installieren und zu verwenden) wäre ised(insbesondere, wenn sich Ihre Daten in einer einzigen Zeile befinden: Sie müssen nur tun ised --l input.dat 'max$1').


Weil Sie nach zwei Zahlen fragen, ist das alles übertrieben. Das sollte reichen:

python -c "print(max($j,$k))"
orion
quelle
1
sys.argvpython2 -c 'import sys; print (max(sys.argv))' "$@"
Könnte
1
Die Argumente, sort + headdie übertrieben sind, aber pythonnicht berechnet werden.
mikeserv
Alle Methoden oberhalb der Zeile sind darauf ausgelegt, große Mengen von Zahlen zu verarbeiten, und schlagen diese Art der Verwendung ausdrücklich vor (Lesen aus einer Pipe oder einer Datei). min / max für 2 Argumente ist eine Frage, die sich anders anfühlt - sie fordert eine Funktion anstelle eines Streams. Ich habe nur gemeint, dass der Stream-Ansatz übertrieben ist - das von Ihnen verwendete Tool ist willkürlich, ich habe es nur verwendet, pythonweil es ordentlich ist.
Orion
Ich würde nennen diese vorgeschlagene Lösung sauberere , aber das könnte sein , weil ich eine bin pythonFrömmler (oder weil es nicht eine Gabel erfordert und einen zusätzlichen gigantischen Dolmetscher) . Oder vielleicht beides.
mikeserv
@mikeserv Ich würde das auch verwenden, wenn ich wüsste, dass es sich um ganze Zahlen handelt. Alle diese Lösungen , die ich erwähnt sind unter der Annahme , dass die Zahlen Schwimmer sein kann - bash tun nicht Floating Point und es sei denn , zsh ist Ihre Mutter Shell, Sie werden eine Gabel (und möglicherweise ein Messer) benötigen.
Orion