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.
bash
shell
arithmetic
jmunsch
quelle
quelle
export current_ && perl -E 'say $ENV{current_}++'
weil ich die Variable nicht von Bash nach Perl importieren konnte?Aus historischen Gründen analysieren numerische Operationen in Bourne / POSIX-Shells Ganzzahlkonstanten mit einer führenden
0
Ziffer als Oktal und nicht als Dezimalzahl. So08
in einem arithmetisches Betrieb ein Syntaxfehler ist, der Nachfolger von07
8 ist , und010
ist äquivalent zu8
.Sie können normale Arithmetik verwenden und dann die Zahlen
printf
auffüllen, wenn Sie sie mit der integrierten Funktion drucken.Die
-v
Option zuprintf
ist bash-spezifisch; Der POSIX-Weg istHier ist ein weiterer Ansatz, der in historischen Systemen nützlich war, die keinen
printf
Befehl hatten und dennoch für die Leistung in den wenigen Shells nützlich sein können, die nichtprintf
als 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ührende1
Ziffer.quelle