Man*_*u R 38 bash shell printf
我每天都有一个自动生成的文件,由shell脚本调用.但是,我面临的问题是自动生成的文件有以下形式:
FILE_MM_DD.dat
Run Code Online (Sandbox Code Playgroud)
...其中MM和DD是2位数月份和日期字符串.
我做了一些研究,并自己打了它,但我不知道如何只使用shell脚本创建这些自定义字符串.
要清楚,我知道Bash中的DATE函数,但我正在寻找的是C中的SPRINTF函数的等价物.
Pau*_*ce. 55
在Bash:
var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2")
Run Code Online (Sandbox Code Playgroud)
或者,相当于,并且更接近sprintf:
printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2"
Run Code Online (Sandbox Code Playgroud)
如果变量包含带前导零的十进制值,则可以删除前导零:
val1=008; val2=02
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)))
Run Code Online (Sandbox Code Playgroud)
要么
printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))
Run Code Online (Sandbox Code Playgroud)
将$((10#$val1))值强制转换为基数10,因此%d格式规范中不认为"08"是无效的八进制值.
如果你正在使用date(至少对于GNU date),你可以省略这样的前导零:
date '+FILE_%-m_%-d.dat'
Run Code Online (Sandbox Code Playgroud)
为完整起见,如果要添加前导零,请填充到一定宽度:
val1=8; val2=2
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2"
Run Code Online (Sandbox Code Playgroud)
或动态宽度:
val1=8; val2=2
width1=4; width2=6
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2"
Run Code Online (Sandbox Code Playgroud)
添加前导零对于创建可轻松排序并在列中整齐排列的值非常有用.
为什么不使用coreutils的printf程序?
$ printf "FILE_%02d_%02d.dat" 1 2
FILE_01_02.dat
Run Code Online (Sandbox Code Playgroud)