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

문자 반복과 관련하여 연관 배열을 사용할 생각입니까? 아니면 중괄호 확장 {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"

-v옵션은 printfbash에 따라 다릅니다. POSIX 방식은 다음과 같습니다.

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

이는 명령이 없는 레거시 시스템에 유용하고 기본 제공 명령이 없는 몇 가지 셸에서 성능을 계속 향상시킬 수 있는 또 다른 접근 방식 printf입니다 printf. 1부터 세기 시작하지 말고, 1000001부터 세기 시작하세요. 이렇게 하면 숫자 앞에 0이 올 필요가 없습니다. 이 번호를 사용할 때는 앞의 1숫자를 제거하세요.

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

관련 정보