Was wäre der beste Weg, um zu überprüfen, ob $ 1 eine Ganzzahl in / bin / dash ist?
In Bash könnte ich tun:
[[ $1 =~ ^([0-9]+)$ ]]
Dies scheint jedoch nicht POSIX-konform zu sein, und Dash unterstützt dies nicht
shell
regular-expression
string
dash
Martin Vegter
quelle
quelle
foo\n123\nbar
ist keine ganze Zahl, würde aber diesen Test bestehen.Ob
dash
,bash
,ksh
,zsh
, POSIXsh
oderposh
( "a Reimplementation der Bourne - Shell"sh
); Dascase
Konstrukt ist das am weitesten verbreitete und zuverlässigste:quelle
dash
? Es funktioniert bei mir unterbash
aber nichtdash
.dash
; Um das Ergebnis abzufragen, habe ichecho $?
nach dem case-Befehl hinzugefügt .posh
("eine Neuimplementierung der Bourne-Shell") hat mit dieser Lösung allerdings auch kein Problem.case
. Ein Grund ist der Fehler, den Sie beschreiben, ein anderer, der in Editoren mit Funktionen, die auf übereinstimmende Klammern (vim) angewiesen sind, eine viel bessere Unterstützung bietet, und nicht zuletzt finde ich es persönlich besser lesbar, wenn sie übereinstimmen. - WRTposh
ist POSIX; Nun, das Zitat aus der Manpage, das ich gegeben habe, deutete auf etwas anderes hin, aber man kann sich sowieso nicht auf solche informellen Aussagen verlassen, denke ich. Die alte Borowski-Shell ist sowieso nicht mehr so bedeutend, seit wir uns in der POSIX-Ära befinden.Sie können den
-eq
Test für die Zeichenfolge mit sich selbst verwenden:Wenn die Fehlermeldung ein Problem darstellt, leiten Sie die Fehlerausgabe weiter an
/dev/null
:quelle
" 023 "
das eine Zahl ist. Beachten Sie, dass dies mit Bindestrich funktioniert, jedoch nicht mit allen anderen POSIX-Shells, da das Verhalten nicht spezifiziert ist, wenn die Operanden Dezimalzahlen sind. Zum Beispiel mit ksh würde es sagen, dassSHLVL
oder1+1
eine Zahl ist.Versuchen Sie, es als arithmetische Erweiterung zu verwenden, und prüfen Sie, ob es funktioniert. Eigentlich muss man etwas strenger sein, weil arithmetische Erweiterungen zum Beispiel führende und nachfolgende Leerzeichen ignorieren würden. Führen Sie also eine arithmetische Erweiterung durch und stellen Sie sicher, dass das erweiterte Ergebnis genau mit der ursprünglichen Variablen übereinstimmt.
Dies würde auch negative Zahlen akzeptieren - wenn Sie sie wirklich ausschließen möchten, fügen Sie einen zusätzlichen Scheck für hinzu
$((${1} >= 0))
.quelle
[[
$(( ... ))
? Wenn ja, sollte meine Antwort immer noch sachlich korrekt sein, ich muss nur ein zusätzliches Zitat hinzufügen.check_if_number 1.2
und die Funktion zurückgegeben:dash: 3: arithmetic expression: expecting EOF: "1.2"
Vielleicht mit
expr
?quelle
match
noch\+
sind POSIX. Es würde auch sagen, dass 0 keine Zahl ist. Sie wollenexpr "x$1" : 'x[0-9]\{1,\}$'
Im POSIX-System können Sie expr verwenden :
quelle
expr
Implementierungen werden sagen, dass 9999999999999999999 keine ganze Zahl ist. POSIX gibt keine Garantie, dass dies funktioniert. In der Praxis wird zumindest auf einem GNU-System gesagt, dass "Länge" eine ganze Zahl ist.expr 9999999999999999999 + 0
gibt mir ein 3 Exit - Status undexpr -12 + 0
undexpr length + 0
geben Sie mir eine 0 Exit - Status mit GNU ausdr (+ string
Kräftestring
als String mit GNU berücksichtigt werdenexpr
.expr "$a" - 0
Besser funktionieren würde).-12
ist eine gültige Ganzzahl und9999999999999999999
gab einen Überlauf.Hier ist eine einfache Funktion, die dieselbe Methode wie die Antwort von muru verwendet :
Beispiel:
Ausgabe:
quelle