web-dev-qa-db-ja.com

ゼロから1桁の変数を追加する

変数が10未満の場合、変数の前にゼロを追加して、上記のディレクトリを作成しようとします。正しく追加するためにゼロを取得できないようです。 02.1.201102.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
22
Colby

ロット全体を次のように置き換えることができます。

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
53
paxdiablo

使用できます

$(printf %02d $i)

必要な形式で数値を生成します。

for i in $(seq 0 1 31)
do
    mkdir $path/02.$(printf %02d $i).2011
done
20
Jesse Cohen

より良い:

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
13
Juliano

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
4

これはあなたのために働きますか?

zeroes="0000000"
pad=$zeroes$i
echo ${pad:(-2)}
3
Adam Liss
$ seq --version | head -1
seq (GNU coreutils) 8.21
$ seq -f "%02g" 1 10
01
02
03
04
05
06
07
08
09
10
2
Amin Abbaspour

私はこれを実行するためにこの簡単なユーティリティを作成しました、幸運、これが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
0
Dhaulakhandi

If/thenステートメントは逆向きです。 0を追加するのは10を超える場合であり、0を下回る場合は追加しません。

別のバグは、10が2桁であっても、カットオフを厳密に10より大きくすることです。これには10は含まれません。

0
Kevin Dolan
path=/tmp
Ruby -rfileutils -e '1.upto(31){|x| FileUtils.mkdir "'$path'/02.%02d.2011" % x}'
0
kurumi

Paxdiabloが共有する改良された正規表現をデフォルトで使用して、日、範囲、正規表現などを要求するスクリプトに対して行った処理を次に示します。

for day in $days
    do if [ 1 -eq "${#day}"] ; then
        day="0$day"
    fi

ループの最初でこれを実行し、問題の日に大量のログ分析を実行し、先頭にゼロを付けてディレクトリに埋めました。

0
jth