如何在bash中迭代一个零填充整数?

jmu*_*sch 8 shell bash arithmetic

如何以“[AZ][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]*")
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试添加 1 时:

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

它计数到“000009”并回滚到“000000”。

我加入如下:

next_=$(echo "$current_letter$next_number")
Run Code Online (Sandbox Code Playgroud)

关于字母迭代,我正在考虑使用关联数组?或大括号扩展{A..Z},但这是一个完全不同的问题。

Sté*_*las 15

在 中bash,带有前导零的数字被视为八进制。要强制bash将它们视为十进制,您可以添加10#前缀:

next_number=$(printf %06d "$((10#$current_number + 1))")
Run Code Online (Sandbox Code Playgroud)

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

printf -v next_number %06d "$((10#$current_number + 1))"
Run Code Online (Sandbox Code Playgroud)

(注意,它不为负数的工作10#-010被看作是10#0 - 010bash,这样既$((10#-10))$((-10#-10))扩展到-8)。

也可以看看:

$ printf 'A%06d\n' {5..12}
A000005
A000006
A000007
A000008
A000009
A000010
A000011
A000012
Run Code Online (Sandbox Code Playgroud)

或者:

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

或者:

$ seq -f A%06g 5 12
A000005
A000006
A000007
A000008
A000009
A000010
A000011
A000012
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 5

Perl 来拯救:

perl -E '$x = "A001"; say $x++ for 1 .. 1002' 
Run Code Online (Sandbox Code Playgroud)

输出:

A001
A002
A003
A004
A005
A006
A007
A008
A009
A010
A011
...
A996
A997
A998
A999
B000
B001
B002
Run Code Online (Sandbox Code Playgroud)

++ 运算符处理字母和数字。