"[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 - 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
답변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
산술 연산의 구문 오류이며 의 후속은 07
8이며 와 010
동일합니다 8
.
일반 산술을 사용한 다음 내장 함수를 사용하여 인쇄할 때 숫자를 채울 수 있습니다 printf
.
next_number=$(($current_number + 1))
printf -v padded_next_number %06d "$next_number"
-v
옵션은 printf
bash에 따라 다릅니다. 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