変数が10未満の場合、変数の前にゼロを追加して、上記のディレクトリを作成しようとします。正しく追加するためにゼロを取得できないようです。 02.1.2011
、02.2.2011
などを作成し続けます。
i=0
for i in {01..31}
do
if $i > 10
then
mkdir $path/02.0$i.2011
else
mkdir $path/02.$i.2011
fi
done
ロット全体を次のように置き換えることができます。
for i in 0{1..9} {10..31} ; do
mkdir $path/02.$i.2011
done
ただし、外部プロセス(ループ本体にあるものを除く)を起動する必要はありません。
それはおそらくそれほど重要ではありませんheremkdir
はタイトなループで多くのことをする傾向のあるものではありませんが、willbash
に多くの迅速で汚いコードを記述します。
私のスクリプトのいくつかは時折行っているように、プロセスの作成は数十万回行うと高価です:-)
実際の動作を確認できる例:
pax$ for i in 0{7..9} {10..12}; do echo $i; done
07
08
09
10
11
12
また、bash
の最近の十分なバージョンがある場合、先頭の数字の要求を尊重します。
シーケンス式の形式は
{x..y[..incr]}
です。ここで、x
およびy
は整数または単一文字であり、オプションの増分であるincr
は整数です。整数を指定すると、式はx
からy
までの各数値に展開されます。指定された整数には、各用語の幅を同じにするために、0
をプレフィックスとして付けることができます。x
またはy
のいずれかがゼロで始まる場合、シェルは生成されたすべての用語に同じ桁数が含まれるようにし、必要に応じてゼロを埋め込みます。
だから、私のDebian 6ボックスでは、bash
バージョン4.1.5で:
pax$ for i in {07..11} ; do echo $i ; done
07
08
09
10
11
使用できます
$(printf %02d $i)
必要な形式で数値を生成します。
for i in $(seq 0 1 31)
do
mkdir $path/02.$(printf %02d $i).2011
done
より良い:
for i in $(seq -f %02g 1 31)
do
mkdir "$path/02.$i.2011"
done
あるいは:
for i in {01..31}
do
mkdir "$path/02.$(printf "%02d" $i).2011"
done
Bash 4では、ブレース範囲の拡張は、要求した場合に先行ゼロを提供します。
for i in {01..31}
他に何もする必要はありません。
Bashの以前のバージョン(または4)を使用している場合、seq
などの外部ユーティリティを使用する必要はありません。
for i in {1..31}
または
for ((i=1; i<=31; i++))
それらのいずれかで:
mkdir "$path/02.$(printf '%02d' "$i").2011"
次のこともできます。
z='0'
mkdir "$path/02.${z: -${#i}}$i.2011"
Paxdiabloの提案を使用すると、すべてのディレクトリを一度に作成できますループなしで:
mkdir "$path"/02.{0{1..9},{10..31}}.2011
これはあなたのために働きますか?
zeroes="0000000"
pad=$zeroes$i
echo ${pad:(-2)}
$ seq --version | head -1
seq (GNU coreutils) 8.21
$ seq -f "%02g" 1 10
01
02
03
04
05
06
07
08
09
10
私はこれを実行するためにこの簡単なユーティリティを作成しました、幸運、これがstack'ersに役立つことを望みます!!
for i in {1..24}
do
charcount=`echo $i|wc -m`
count=`expr $charcount - 1`
if [ $count -lt 2 ];
then
i="0`echo $i`"
fi
echo "$i"
done
If/thenステートメントは逆向きです。 0を追加するのは10を超える場合であり、0を下回る場合は追加しません。
別のバグは、10が2桁であっても、カットオフを厳密に10より大きくすることです。これには10は含まれません。
path=/tmp
Ruby -rfileutils -e '1.upto(31){|x| FileUtils.mkdir "'$path'/02.%02d.2011" % x}'
Paxdiabloが共有する改良された正規表現をデフォルトで使用して、日、範囲、正規表現などを要求するスクリプトに対して行った処理を次に示します。
for day in $days
do if [ 1 -eq "${#day}"] ; then
day="0$day"
fi
ループの最初でこれを実行し、問題の日に大量のログ分析を実行し、先頭にゼロを付けてディレクトリに埋めました。