Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash:将格式信息传递到printf_Bash_Printf - Fatal编程技术网

bash:将格式信息传递到printf

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()

Iv'e得到了一个带有通用用法/错误函数的脚本,它打印出错误,然后给出脚本用法信息。为了便于讨论,我将其简化为以下示例:

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多几分……你一直在干什么……偷懒?