bash:将格式信息传递到printf
Iv'e得到了一个带有通用用法/错误函数的脚本,它打印出错误,然后给出脚本用法信息。为了便于讨论,我将其简化为以下示例:bash:将格式信息传递到printf,bash,printf,Bash,Printf,Iv'e得到了一个带有通用用法/错误函数的脚本,它打印出错误,然后给出脚本用法信息。为了便于讨论,我将其简化为以下示例: usage() { test -n "$1" && printf "\n %s" "$1" >&2 } usage "Error: text1 \ntext2 \ntext3" 这将产生以下输出: Error: text1 \ntext2 \ntext3 我希望每套文本都在一行上。如何执行此操作?只需删除格式字符串: usage()
usage() {
test -n "$1" && printf "\n %s" "$1" >&2
}
usage "Error: text1 \ntext2 \ntext3"
这将产生以下输出:
Error: text1 \ntext2 \ntext3
我希望每套文本都在一行上。如何执行此操作?只需删除格式字符串:
usage() {
[[ -n "$1" ]] && printf "$1" >&2
}
usage "Error: text1 \ntext2 \ntext3"
您可以使用
%b
格式:
usage() { [[ $@ ]] && printf "%b\n" "$@"; }
并称之为:
usage "Error: text1 \ntext2 \ntext3"
输出:
Error: text1
text2
text3
根据帮助打印f
:
%b expand backslash escape sequences in the corresponding argument
在创建作为参数传递的文本时,可以使用
$'…'
语法处理转义序列
usage $'Error: text1 \ntext2 \ntext3'
请参见不清楚,但如果您想要一个
用法
函数,将每个参数放在自己的行中,您可以使用此函数:
$ usage() {
printf %s\\n "$@" >&2
}
$ usage 'Error: text1' text2 text3
Error: text1
text2
text3
或者自己执行循环,并防止用法
在空参数上输出任何内容:
usage() {
for arg; do
printf %s\\n "$arg" >&2
done
}
或者借用anubhava的回答:
usage() {
[[ "$@" ]] && printf %s\\n "$@" >&2
}
或者没有巴什主义:
usage() {
[ -n "$*" ]] && printf %s\\n "$@" >&2
}
我明白了,那么我不能在那个printf中有任何其他格式,但我可以在之前或之后再做一次printf,对吗?@Ray:如果其他格式与您的问题相关,请将其包含在您的示例中。您可能会将其缩减得太多。@Ray我不知道您想要打印的其他格式。您能举个例子吗?因为您e仅打印1美元,我假设您只是对换行扩展感兴趣。这实际上很容易出错。请尝试调用
用法“%pqr”
谢谢@Blue Moon。我将两个答案都奖励一分,并根据我的一般“通行证格式问题”将其标记为更“正确”的答案。再次感谢。我也将一个错误代码传递到函数中,因此我认为我无法执行$@,对吗。为什么将其从$1更改?因为我想允许此函数中也包含多个参数。但您当然可以使用:usage(){[[$1]]&&printf“%b\n”“$1”}
只打印一个参数。`谢谢你的回答和评论。我想你需要比287K多几分……你一直在干什么……偷懒?