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

これは、コマンドのないレガシーシステムに便利で、組み込みのコマンドを持たないいくつかのシェルでパフォーマンスを向上させ続けるもう1つのアプローチprintfですprintf。 1から世紀を始めないで、1000001から世紀を始めてください。これにより、数字の前にゼロが来る必要がなくなります。この番号を使用するときは、前の1数字を削除してください。

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

関連情報