Bash

如何在bash中迭代零填充整數?

  • June 11, 2020

如何使用“”形式迭代一個字元串

$$ A-Z $$$$ 0-9 $$*" 或者例如:“A000001”? 收到變數後,我拆分:

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]*")

但是,當我嘗試添加 1 時:

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

它計數到“000009”並回滾到“000000”。

我加入如下:

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

關於字母迭代,我正在考慮使用關聯數組?或大括號擴展{A..Z},但這是一個完全不同的問題。

bash中,帶前導零的數字被視為八進制。要強制bash將它們視為十進制,您可以添加10#前綴:

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

或者使用 bash 3.1 或更高版本,以避免分叉:

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

(請注意,它不適用於如中所示的負數,10#-010因此兩者都和擴展為)。10#0 - 010``bash``$((10#-10))``$((-10#-10))``-8

也可以看看:

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

或者:

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

或者:

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

引用自:https://unix.stackexchange.com/questions/168674