Bash에서 0으로 채워진 정수를 반복하는 방법은 무엇입니까?

Bash에서 0으로 채워진 정수를 반복하는 방법은 무엇입니까?

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

그러나 1을 추가하려고 하면 다음과 같습니다.

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

"000009"로 계산되고 "000000"으로 롤백됩니다.

그리고 나는 다음과 같이 합류합니다.

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

그리고 Letter 반복과 관련하여 Associated Array를 사용하려고 생각하고 있었습니까? 아니면 중괄호 확장 {A..Z}이지만 그것은 완전히 다른 질문입니다.

답변1

에서는 bash앞에 0이 붙은 숫자가 8진수로 간주됩니다. 이를 소수로 간주하려면 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 - 010bash$((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

답변2

Perl을 구출해 보세요:

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

산출:

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

++ 연산자는 문자와 숫자를 모두 처리합니다.

답변3

역사적인 이유로 Bourne/POSIX 스타일 쉘의 수치 연산은 선행 0숫자가 있는 정수 상수를 10진수가 아닌 8진수로 구문 분석합니다. 따라서 08산술 연산에서 구문 오류가 발생하고 의 후속 문자는 078이며 010와 같습니다 8.

일반 산술을 사용한 다음 printf내장 기능으로 인쇄할 때 숫자를 채울 수 있습니다.

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

옵션 -vprintfbash에 따라 다릅니다. POSIX 방식은

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

다음은 명령이 없는 역사적 시스템에서 유용했고 내장 기능이 printf없는 몇 가지 셸의 성능에 여전히 유용할 수 있는 또 다른 접근 방식입니다. printf1부터 세는 대신 1000001부터 세세요. 이렇게 하면 숫자 앞에 0이 올 필요가 없습니다. 숫자를 사용할 때 앞자리 1숫자를 제거하세요.

number=1000000
while … ; do
  number=$((number+1))
  echo "${number#1}"
done

관련 정보