Wie iteriere ich eine mit Nullen aufgefüllte Ganzzahl in Bash?


8

Wie iteriert man einen String mit der Form "[AZ] [0-9] *" Oder zum Beispiel: "A000001"?

Nach Erhalt der Variablen habe ich aufgeteilt:

current_=$(mysql -h"$mysqlhost" -u"$mysqluser" -p"$PASS" "$DBNAME" -se "SELECT current_ FROM $GLOBALDB;")
current_number=$(echo $current_ | grep -oh "[0-9]*")
current_letter=$(echo $current_ | grep -oh "[A-Z]*")

Wenn ich jedoch versuche, 1 hinzuzufügen:

# add 1 & keep all leading zeros "000001"
next_number=$(printf %06d $(($current_number + 1)))

Es zählt bis "000009" und wird auf "000000" zurückgesetzt.

Und ich mache wie folgt mit:

next_=$(echo "$current_letter$next_number")

Und in Bezug auf die Buchstabeniteration habe ich darüber nachgedacht, ein assoziiertes Array zu verwenden? Oder Klammererweiterung {A..Z}, aber das ist eine ganz andere Frage.

Antworten:


14

In bashwerden Zahlen mit führenden Nullen als oktal betrachtet.

Sie können verwenden:

next_number=$(printf %06d "$((10#$current_number + 1))")

Zu sagen bash, es als dezimal zu betrachten.

Siehe auch:

$ printf 'A%06d\n' {5..12}
A000005
A000006
A000007
A000008
A000009
A000010
A000011
A000012

Oder:

$ printf '%s\n' {A..C}{00008..00012}
A00008
A00009
A00010
A00011
A00012
B00008
B00009
B00010
B00011
B00012
C00008
C00009
C00010
C00011
C00012

Oder:

$ seq -f A%06g 5 12
A000005
A000006
A000007
A000008
A000009
A000010
A000011
A000012

5

Perl zur Rettung:

perl -E '$x = "A001"; say $x++ for 1 .. 1002' 

Ausgabe:

A001
A002
A003
A004
A005
A006
A007
A008
A009
A010
A011
...
A996
A997
A998
A999
B000
B001
B002

Der ++ - Operator verarbeitet sowohl Buchstaben als auch Zahlen.


Ich weiß, dass Perl in Ubuntu enthalten ist, aber ist es eine eingebaute Bash? Ich habe genau 0 Erfahrung im Schreiben in Perl. Das funktioniert eindeutig.
jmunsch

@jmunsch: Perl ist kein Teil von Bash. Es ist eine eigene Programmiersprache.
Choroba

Ich habe etwas gesucht. Es sieht so aus, als ob Perl in vielen Distributionen ist? Und das Hinzufügen einer Abhängigkeit von Perl ist kein Problem? Danke für deine Antwort.
jmunsch

1
@jmunsch: Perl sollte auf jedem Linux vorhanden sein. Sie können es auch auf den meisten * ix-Systemen sowie auf MS Windows finden oder installieren.
Choroba

Wäre dies eine bessere Perl-Antwort? export current_ && perl -E 'say $ENV{current_}++'weil ich die Variable nicht von Bash nach Perl importieren konnte?
jmunsch

1

Aus historischen Gründen analysieren numerische Operationen in Bourne / POSIX-Shells Ganzzahlkonstanten mit einer führenden 0Ziffer als Oktal und nicht als Dezimalzahl. So 08in einem arithmetisches Betrieb ein Syntaxfehler ist, der Nachfolger von 078 ist , und 010ist äquivalent zu 8.

Sie können normale Arithmetik verwenden und dann die Zahlen printfauffüllen, wenn Sie sie mit der integrierten Funktion drucken.

next_number=$(($current_number + 1))
printf -v padded_next_number %06d $next_number

Die -vOption zu printfist bash-spezifisch; Der POSIX-Weg ist

next_number=$(($current_number + 1))
padded_next_number=$(printf %06d $next_number)

Hier ist ein weiterer Ansatz, der in historischen Systemen nützlich war, die keinen printfBefehl hatten und dennoch für die Leistung in den wenigen Shells nützlich sein können, die nicht printfals eingebautes System vorhanden sind. Anstatt von 1 zu zählen, zählen Sie von 1000001. Auf diese Weise müssen Ihre Zahlen niemals führende Nullen haben. Wenn Sie die Nummer verwenden, entfernen Sie die führende 1Ziffer.

number=1000000
while  ; do
  number=$((number+1))
  echo "${number#1}"
  
done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.