如何使用以'-'开头的格式字符串调用printf命令?
问题
现有如下数组:
items=(one two three)
需要为每个元素添加前导-,预期输出:
- one - two - three
直接执行以下命令会报错:
printf '- %s\n' "${items[@]}"
错误信息:
bash: printf: - : invalid option printf: usage: printf [-v var] format [arguments]
尝试用\-转义会输出字面量\-,用\055依赖ASCII编码,求可移植的实现方案。
解决方案
1. 使用--终止选项解析(推荐)
printf支持用--标记选项结束,后续内容会被当作普通参数处理,不会被解析为命令选项,这是符合POSIX标准的可移植方案:
printf -- '- %s\n' "${items[@]}"
2. 循环遍历输出(兼容所有POSIX shell)
如果需要适配最基础的POSIX shell,也可以通过循环逐个处理数组元素:
for item in "${items[@]}"; do printf '- %s\n' "$item" done
这种方式代码稍长,但完全不依赖shell扩展特性,兼容性拉满。
3. 利用参数替换(bash/zsh等扩展shell)
在bash或zsh这类支持参数扩展的shell中,可以直接对数组元素做前缀替换:
printf '%s\n' "${items[@]/#/- }"
这里/#/- 表示将每个数组元素的开头(#匹配开头)替换为- ,简洁高效,但仅适用于支持该扩展的shell,不是完全POSIX可移植的。
内容的提问来源于stack exchange,提问作者Toby Speight
相关产品推荐
相关产品推荐

