我每天都有一個自動生成的文件被shell腳本調用。 但是,我現在面臨的問題是自動生成的文件具有的一種形式:shell腳本中的SPRINTF?
FILE_MM_DD.dat
...其中MM和DD是2位數的月份和日期的最-月份字符串。
我做了一些研究,並在我自己的研究,但我不知道如何創建這些自定義字符串只使用shell腳本。
要清楚,我知道在猛砸DATE功能,但爲什麼不利用的coreutils中的printf程序是什麼我要找的是sprintf函數的等值C.
我每天都有一個自動生成的文件被shell腳本調用。 但是,我現在面臨的問題是自動生成的文件具有的一種形式:shell腳本中的SPRINTF?
FILE_MM_DD.dat
...其中MM和DD是2位數的月份和日期的最-月份字符串。
我做了一些研究,並在我自己的研究,但我不知道如何創建這些自定義字符串只使用shell腳本。
要清楚,我知道在猛砸DATE功能,但爲什麼不利用的coreutils中的printf程序是什麼我要找的是sprintf函數的等值C.
在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"
添加前導零對於創建可以輕鬆排序並在列中整齊排列的值非常有用。
?
$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat
嘗試:
sprintf() { local stdin; read -d '' -u 0 stdin; printf "[email protected]" "$stdin"; }
例子:
$ echo bar | sprintf "foo %s"
foo bar
另外,我的規格要求,我產生這樣FILE_12_1.dat代替FILE_12_01.dat在需要的字符串。 – 2010-12-07 14:46:10
然後「DD」是錯誤的。 – 2010-12-07 14:49:18
正確,DD不是我規範的一部分,但只是解釋事物的捷徑。有任何想法嗎? – 2010-12-07 15:25:40