2010-12-07 535 views
32

我每天都有一個自動生成的文件被shell腳本調用。 但是,我現在面臨的問題是自動生成的文件具有的一種形式:shell腳本中的SPRINTF?

FILE_MM_DD.dat 

...其中MM和DD是2位數的月份和日期的最-月份字符串。

我做了一些研究,並在我自己的研究,但我不知道如何創建這些自定義字符串只使用shell腳本。

要清楚,我知道在猛砸DATE功能,但爲什麼不利用的coreutils中的printf程序是什麼我要找的是sprintf函數的等值C.

+0

另外,我的規格要求,我產生這樣FILE_12_1.dat代替FILE_12_01.dat在需要的字符串。 – 2010-12-07 14:46:10

+0

然後「DD」是錯誤的。 – 2010-12-07 14:49:18

+1

正確,DD不是我規範的一部分,但只是解釋事物的捷徑。有任何想法嗎? – 2010-12-07 15:25:40

回答

42

在bash:

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

或者,等效,並接近sprintf

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

如果變量包含有前導零的十進制值,你可以刪除前導零:

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))脅迫的值到基座10,從而在格式規範的%d並不認爲「08」是一個無效的八進制值。

如果你使用date(至少對於GNU 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" 

添加前導零對於創建可以輕鬆排序並在列中整齊排列的值非常有用。

7

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

嘗試:

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

例子:

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