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