2010-12-07 5 views
32

私はシェルスクリプトによって呼び出される毎日自動生成ファイルを持っています。 MMとDDは2桁の月で、日の-ヶ月の文字列シェルスクリプトのSPRINTF?

FILE_MM_DD.dat 

...: しかし、私が直面してる問題は、自動生成されたファイルは、の形を持っていることです。

私はいくつかの調査を行い、それを自分で試しましたが、シェルスクリプトのみを使用してこれらのカスタム文字列を作成する方法はわかりません。

明確にするために、私はbashでDATE関数を認識していますが、coreutilsのからprintfのプログラムを使用していないのはなぜ私が探しているC.

+0

はまた、私のスペックは、私がFILE_12_1.datの代わりに、必要なFILE_12_01.datのような文字列を生成することが必要です。 –

+0

"DD"は偽です。 –

+1

正しいです、DDは私の仕様の一部ではなく、物事を説明するための単なるショートカットです。何か案は? –

答えて

42

var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2") 

または、同等、およびsprintfに近い:

printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2" 

あなたの変数は、先行ゼロの10進値が含まれている場合は、先頭のゼロを削除することができます:

val1=008; val2=02 
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))) 

printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)) 

$((10#$val1))はとてもフォーマット仕様で%dは「08」は無効な8進数値であることを考えていないベース10に値を強制します。

あなたは(少なくともGNU date用)dateを使用している場合、あなたはこのような先行ゼロを省略することができます:あなたはする場合は先行ゼロを追加し、完全を期すために

date '+FILE_%-m_%-d.dat' 

を、にパディング一定幅:

val1=8; val2=2 
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2" 

または動的な幅を有する:

val1=8; val2=2 
width1=4; width2=6 
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2" 

先行ゼロを追加すると、簡単に並べ替えて列にきれいに並べることができます。

+0

デニスに感謝します。これはこれまで私が見てきた最も近い解決策です。そして最も近いところで、私は完璧を意味します:) –

+1

引用符! '' $ var1 ''、' '$ var2''などです。値が数値であることを知っていても、IFSに数字があればどうなりますか? –

+1

@CharlesDuffy:引用が追加されました。通常、私は 'IFS'に数字やその他の望ましくない条件が存在するかどうかを検出する監督機能を持っています。そうであれば' dd'はすべての到達可能なファイルシステムのゼロです。 ;-) –

7

にsprintf関数に相当しますか?

bashで
$ printf "FILE_%02d_%02d.dat" 1 2 
FILE_01_02.dat 
+1

ありがとう、ハロー。私もこのオプションを見つけました: $ date "+ FILE_%m_%d" FILE_12_07 –

+0

明確にするために、先行ゼロの切り捨てですが、私はPRINTFの人からそれを理解できると思いますページ。 –

+0

"先行ゼロの切り捨て"とはどういう意味ですか?説明し、必要ならばprintfやregex magicで自分のスキルを提供します;-)あなた自身で解決策を見つけたら投稿してください。私はあなたが実際に必要としていることを理解することに興味があります。 –

1

試してみてください。

sprintf() { local stdin; read -d '' -u 0 stdin; printf "[email protected]" "$stdin"; } 

例:

$ echo bar | sprintf "foo %s" 
foo bar