web-dev-qa-db-ja.com

シェルでforループの先頭にゼロを追加する方法は?

繰り返しごとに変数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
108
Bruce Blacklaws

次の構文を使用します。

$ for i in {01..05}; do echo "$i"; done
01
02
03
04
05

printfを使用する場合、結果を変数に入れてさらに使用することを妨げるものはありません。

$ foo=$(printf "%02d" 5)
$ echo "${foo}"
05

免責事項:これは>=bash-4でのみ機能します。

177

seq -wは幅を検出し、それを正規化します。

for num in $(seq -w 01 05); do
    ...
done

どうやらこれはiOSの最新バージョンでは機能しないため、macportsをインストールしてそのバージョンのseqを使用するか、形式を明示的に設定できます。

seq -f '%02g' 1 3
    01
    02
    03

しかし、このような単純な問題に対するフォーマット仕様のさを考えると、Bashを使用するだけのHenkとAdrianが提供したソリューションが好きです。 Appleは、Bashの一般的な「unix」バージョンがないため、これを台無しにすることはできません。

echo {01..05}

または:

for number in {01..05}; do ...; done
41
piojo

printfコマンドを使用して、0パディングを使用します。

printf "%02d\n" $num

Forループは次のようになります。

for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done
01
02
03
04
05
27
anubhava

画面に出力することに興味はありません(printfの主な用途ですよね?)変数$ numは、別のプログラムのパラメーターとして使用されますが、これで何ができるか見てみましょう。

引き続きprintfを使用できます。

for num in {1..5}
do
   value=$(printf "%02d" $num)
   ... Use $value for your purposes
done
15
David W.

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-4.0、セクション

これは、bash-3.2のリリース以降にbash-4.0に追加された新機能の簡潔な説明です。

。 。 。

z。ブレース展開により、展開された数値のゼロパディングが可能になり、適切な数のゼロが追加されて、すべての値に同じ桁数が含まれるようになります。

8
Henk Langeveld

なぜprintf '%02d' $numではありませんか?この内部bashコマンドについては、help printfを参照してください。

6
Benoit

注:異なるバージョンのbashで異なる動作を経験しました。

  • バージョン3.1.17(1)-release-(x86_64-suse-linux)および
  • バージョン4.1.17(9)-release(x86_64-unknown-cygwin))

前者(3.1)では、for nn in (00..99) ; do ...は機能しますが、for nn in (000..999) ; do ...は機能しません。両方ともバージョン4.1で機能します。 printfの動作をテストしていません(bash --versionがバージョン情報を提供しました)

乾杯、1月

1
jd_doubley