我有一个bash函数,它获取值(使用curl和cut)并从它们创建一个文件名。现在,我想支持第二个命名方案,它需要一组不同的参数。
示例:
#!/bin/bash
TEMPLATE="%02i. %s.txt"
foo() {
a="Imagine these to"
b="be set dynamically"
c="42"
filename="$(printf "$TEMPLATE" "$c" "$a")"
# second: filename="$a - $b.txt"
# or: filename="$(printf "%s - %s.txt" "$a" "$b")"
echo "$filename"
# generate file
}
# actual script loops over:
foo
其中一个值是一个数字,如果需要的话,应该用前导零填充,因此在当前实现中使用printf
。
有没有一种方法可以通过在全球范围内设置不同的模板来实现这一点?这将要求模板可以按索引访问参数,或者至少跳过其中的一些参数。
如果没有,我有什么选择?模板将由命令行参数选择,初始化后不会更改。
不起作用的是:
发布于 2012-11-27 01:59:09
如果需要跳过一个参数,可以使用%.s
。示例:
$ printf "%.s%s\n" "Bonjour" "Hello"
Hello
$ printf "%s%.s\n" "Bonjour" "Hello"
Bonjour
AFAIK,您不能按索引访问参数。
如果需要将格式化的字符串存储在变量中,请不要使用子subshell,如下所示:
$ variable=$(printf "%.s%s" "Bonjour" "Hello")
$ echo "$variable"
Hello
相反,使用-v
选项printf
(键入help printf
以获得详细信息),如下所示:
$ printf -v variable "%.s%s" "Bonjour" "Hello"
$ echo "$variable"
Hello
另外,如果您的模板可以来自用户输入,我建议您在它之前添加--
(这是结束命令的选项,以防用户想用破折号启动模板)。所以我会取代你的线路
filename="$(printf "$TEMPLATE" "$c" "$a")"
使用
printf -v filename -- "$TEMPLATE" "$c" "$a"
最后,大写变量名被认为是不好的bash实践。
https://stackoverflow.com/questions/13581484
复制相似问题