bash:将格式信息传递给printf

时间:2015-09-02 21:20:40

标签: bash printf

我得到了一个带有通用用法/错误函数的脚本,它打印出错误,然后给出脚本用法信息。为了讨论这个例子,我把它减少了:

usage() {
  test -n "$1" && printf "\n %s" "$1" >&2
}

usage "Error:  text1 \ntext2 \ntext3"

这会产生输出:

Error:  text1 \ntext2 \ntext3

我希望每组文本都在一个单独的行上。我该怎么做?

4 个答案:

答案 0 :(得分:4)

您可以使用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

help printf

答案 1 :(得分:3)

您可以在创建作为参数传递的文字时使用$'...'语法处理转义序列。

usage $'Error:  text1 \ntext2 \ntext3'

请参阅ANSI-C Quoting

答案 2 :(得分:1)

只需删除格式字符串:

@Path("/hello")
handleTestRequest(
    @QueryParam("name") String name,
    @DefaultValue("-1") @QueryParam("age") Integer age)

答案 3 :(得分:0)

目前还不清楚,但如果你想要一个usage函数将每个参数放在自己的行上,你可以改用它:

$ usage() {
    printf %s\\n "$@" >&2
}
$ usage 'Error:  text1' text2 text3
Error:  text1
text2
text3

或者自己做循环并让usage不要在空参数上输出任何内容:

usage() {
    for arg; do
        printf %s\\n "$arg" >&2
    done
}

或借用anubhava的答案:

usage() {
    [[ "$@" ]] && printf %s\\n "$@" >&2
}

或没有[[基础:

usage() {
    [ -n "$*" ]] && printf %s\\n "$@" >&2
}