各反復で変数 num を 1 ずつインクリメントするループの基本的な数値があります...
for (( num=1; num<=5; num++ ))
do
echo $num
done
どの出力:
1
2
3
4
5
出力を生成しようとしています ($num の前に先行ゼロを追加します):
01
02
03
04
05
せずに:
echo 0$num
seq -w
最大入力幅を検出し、出力の幅を正規化します。
for num in $(seq -w 01 05); do
...
done
執筆時点では、これは OSX の最新バージョンでは機能しなかったため、macports をインストールしてそのバージョンの を使用するかseq
、フォーマットを明示的に設定することができます。
seq -f '%02g' 1 3
01
02
03
しかし、このような単純な問題に対するフォーマット仕様の醜さを考えると、私は Henk と Adrian が提供した、Bash だけを使用した解決策を好みます。一般的な「UNIX」バージョンの Bash がないため、Apple はこれを台無しにすることはできません。
echo {01..05}
または:
for number in {01..05}; do ...; done
printf
コマンドを使用して0
パディングを行います。
printf "%02d\n" $num
for ループは次のようになります。
for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done
01
02
03
04
05
私はそれを画面に出力することに興味はありません (それは printf が主に使用されるものですよね?) 変数 $num は別のプログラムのパラメーターとして使用される予定ですが、これで何ができるか見てみましょう。
あなたはまだ使用することができますprintf
:
for num in {1..5}
do
value=$(printf "%02d" $num)
... Use $value for your purposes
done
bash 4.0 以降では、固定長の文字列でBrace Expansionを使用できます。元の発表については、以下を参照してください。
必要なことだけを行い、シェルの外部には何も必要としません。
$ echo {01..05}
01 02 03 04 05
for num in {01..05}
do
echo $num
done
01
02
03
04
05
これは、bash-3.2 のリリース以降に bash-4.0 に追加された新機能の簡潔な説明です。
. . .
z。中括弧の展開により、展開された数値のゼロ パディングが可能になり、適切な数のゼロを追加して、すべての値が同じ桁数になるようにします。
なぜprintf '%02d' $num
ですか?help printf
この内部 bash コマンドについては、を参照してください。
注意: bash の異なるバージョンで異なる動作を経験しました:
前者 (3.1)for nn in (00..99) ; do ...
は機能しますがfor nn in (000..999) ; do ...
機能しません。両方ともバージョン 4.1 で機能します。printf の動作をテストしていません (bash --version
バージョン情報を提供)
乾杯、ジャン