如何避免在Bash`printf`中使用空数组打印任何内容?
我经常使用这样的快捷方式打印出数组的内容printf:
$ printf "%sn" "${my_array[@]}"
$ printf "%s " "${my_array[@]}"
这在一般情况下效果很好:
$ my_array=(limburger stilton wensleydale)
$ printf "%sn" "${my_array[@]}"
limburger
stilton
wensleydale
$
效果很好,但是当数组为空时,它仍然输出单个字符(换行符或空字节):
$ my_array=()
$ printf "%sn" "${my_array[@]}"
$
当然,我可以通过首先测试一个空数组来避免这种情况:
$ [[ ${#my_array[@]} -gt 0 ]] && printf "%sn" "${my_array[@]}"
$ (( ${#my_array[@]} )) && printf "%sn" "${my_array[@]}"
但是我一直在使用这个习语,并且希望它尽可能短。有没有更好(更短)的解决方案,也许是不同的printf格式,它根本不会用空数组打印任何内容?
回答
Bash 的参数扩展可能有帮助:
printf "%b" "${my_array[@]/%/n}"
来自help printf:
%b: 在相应的参数中展开反斜杠转义序列
或者
printf "%s" "${my_array[@]/%/$'n'}"