いくつかの値をループする必要があります、
for i in $(seq $first $last)
do
does something here
done
$first
と$last
の場合、固定長5である必要があります。したがって、入力が1
の場合は、00001
になるようにゼロを追加する必要があります。たとえば99999
までループしますが、長さは5でなければなりません。
例:00002
、00042
、00212
、012312
など。
どのように私はそれを行うことができますかについての任意のアイデア?
あなたの特定のケースでは、リストを出力するときに数字をフォーマットするためにseq
に-f
フラグを使うのがおそらく最も簡単です。例えば:
for i in $(seq -f "%05g" 10 15)
do
echo $i
done
次のような出力が得られます。
00010
00011
00012
00013
00014
00015
より一般的には、bash
は組み込みとしてprintf
を持っているので、次のように出力にゼロを埋め込むことができます。
$ i=99
$ printf "%05d\n" $i
00099
-v
フラグを使用して、出力を別の変数に格納することができます。
$ i=99
$ printf -v j "%05d" $i
$ echo $j
00099
printf
はseq
とは少し異なるフォーマットをサポートしているので、%05d
の代わりに%05g
を使用する必要があります。
もっと簡単
for i in {00001..99999}; do
echo $i
done
シーケンスの終わりに最大の長さのパディングがある場合(例えば、5桁が必要でcommandが "seq 1 10000"の場合)、seqに "-w"フラグを使用するよりもパディング自体が追加されます。
seq -w 1 10
作物
01
02
03
04
05
06
07
08
09
10
printfに "%05d"を指定してください。
printf "%05d" 1
printf
を使うととても簡単
[jaypal:~/Temp] printf "%05d\n" 1
00001
[jaypal:~/Temp] printf "%05d\n" 2
00002
次のようにawkを使用します。
awk -v start=1 -v end=10 'BEGIN{for (i=start; i<=end; i++) printf("%05d\n", i)}'
出力:
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
更新:
純粋なbashの代替として、これを実行して同じ出力を取得できます。
for i in {1..10}
do
printf "%05d\n" $i
done
この方法で、外部プログラムseq
を使用してavoidできます。これは、* nixのすべてのフレーバーで利用不可です。 。
必要以上の桁数(ゼロ)で出力を埋め込み、それからtailを使って探している桁数だけを使います。最後の5桁を取得するには、末尾に '6'を使用する必要があります。
for i in $(seq 1 10)
do
RESULT=$(echo 00000$i | tail -c 6)
echo $RESULT
done
N桁が必要な場合は、10 ^ Nを追加して最初の桁を削除します。
for (( num=100; num<=105; num++ ))
do
echo ${num:1:3}
done
出力:
01
02
03
04
05
他の方法 :
zeroos="000"
echo
for num in {99..105};do
echo ${zeroos:${#num}:${#zeroos}}${num}
done
そのため、任意の数値を変換するための単純な関数は次のようになります。
function leading_zero(){
local num=$1
local zeroos=00000
echo ${zeroos:${#num}:${#zeroos}}${num}
}
これも動作します:
for i in {0..9}{0..9}{0..9}{0..9}
do
echo "$i"
done
固定長を達成するために数字をゼロで埋めた直後の場合は、10の最も近い倍数を追加するだけです。 2桁の場合、10 ^ 2を追加し、出力を表示する前に最初の1を削除します。
このソリューションは、forループを使用して、任意の長さの単一の数字、または数字のシーケンス全体をパディング/フォーマットするために機能します。
# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf
pad=100000 ;# 5 digit fixed
for i in {0..99999}; do ((j=pad+i))
echo ${j#?}
done
Mac OSX 10.6.8、Bash ver 3.2.48でテスト済み
1.)1から1000までの数列 'seq'を作成し、幅 '-w'を固定します(幅は終了数の長さ、この場合は1000の場合は4桁で決まります)。
2.)また、 'sed -n'を使用して必要な番号を選択します(この場合は、1から100までの番号を選択します)。
3.)各番号を「エコー」します。数字は変数 'i'に格納され、 '$'を使ってアクセスされます。
長所:このコードはとてもきれいです。
短所: 'seq'はすべてのLinuxシステムに固有のものではありません(私が理解しているように)
for i in `seq -w 1 1000 | sed -n '1,100p'`;
do
echo $i;
done