我如何在Bash中输出一个多重字符串,而不使用多个echo调用,像这样:

echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo 
echo "Report bugs to: "
echo "up home page: "

我正在寻找一种可移植的方法来做到这一点,只使用Bash内置程序。


当前回答

这样做:

dedent() {
    local -n reference="$1"
    reference="$(echo "$reference" | sed 's/^[[:space:]]*//')"
}

text="this is line one
      this is line two
      this is line three\n"

# `text` is passed by reference and gets dedented
dedent text

printf "$text"

不先调用dedent的输出:

this is line one
      this is line two
      this is line three

...和WITH首先调用dedent(如上所示):

this is line one
this is line two
this is line three

完整的解释,请看我已经写过的地方:

相当于python在bash中的textwrap dedent 带额外空格的多行字符串(保留缩进)

当然,感谢@Andreas Louv在这里向我展示了该函数的sed部分。

其他回答

或者你可以这样做:

echo "usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to: 
up home page: "

在这里,文档通常用于此目的。

cat << EOF
usage: up [--level <n>| -n <levels>][--help][--version]

Report bugs to: 
up home page:
EOF

所有boure派生的shell(包括所有版本的Bash)都支持它们。

我通常使用内置的read命令,我认为它更灵活和直观。 它将一行内容读入一个变量,并允许与特殊shell变量IFS绑定的分词。 更多细节请参考本博客或手册页。

read -r -d '' usage <<-EOF
    usage: up [--level <n>| -n <levels>][--help][--version] 

    Report bugs to: $report server
    up home page: $HOME
EOF
echo "$usage"

这样做:

dedent() {
    local -n reference="$1"
    reference="$(echo "$reference" | sed 's/^[[:space:]]*//')"
}

text="this is line one
      this is line two
      this is line three\n"

# `text` is passed by reference and gets dedented
dedent text

printf "$text"

不先调用dedent的输出:

this is line one
      this is line two
      this is line three

...和WITH首先调用dedent(如上所示):

this is line one
this is line two
this is line three

完整的解释,请看我已经写过的地方:

相当于python在bash中的textwrap dedent 带额外空格的多行字符串(保留缩进)

当然,感谢@Andreas Louv在这里向我展示了该函数的sed部分。

还有一件事,使用printf和预定义的变量(这里:msg)作为模板。

msg="First line %s
Second line %s
Third line %s
"

one='additional message for the first line'
two='2'
tri='this is the last one'

printf "$msg" "$one" "$two" "$tri"

这个^^^将按指定的顺序打印整条消息,并插入额外的vars而不是%s。