194

各反復で変数 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
4

7 に答える 7

64

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
于 2013-08-27T08:05:29.953 に答える
46

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

printf "%02d\n" $num

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

for (( num=1; num<=5; num++ )); do printf "%02d\n" $num; done
01
02
03
04
05
于 2013-08-27T08:05:02.827 に答える
28

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

あなたはまだ使用することができますprintf

for num in {1..5}
do
   value=$(printf "%02d" $num)
   ... Use $value for your purposes
done
于 2013-08-27T15:17:35.260 に答える
12

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

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

. . .

z。中括弧の展開により、展開された数値のゼロ パディングが可能になり、適切な数のゼロを追加して、すべての値が同じ桁数になるようにします。

于 2013-08-27T09:05:37.490 に答える
10

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

于 2013-08-27T08:04:45.407 に答える
3

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

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

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

乾杯、ジャン

于 2015-02-05T18:11:01.027 に答える