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

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

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


当前回答

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

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

Report bugs to: 
up home page:
EOF

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

其他回答

使用-e选项,则可以在字符串中打印带\n的新行字符。

例如:

echo -e "This will be the first line \nand this will be on the second line"

Since I recommended printf in a comment, I should probably give some examples of its usage (although for printing a usage message, I'd be more likely to use Dennis' or Chris' answers). printf is a bit more complex to use than echo. Its first argument is a format string, in which escapes (like \n) are always interpreted; it can also contain format directives starting with %, which control where and how any additional arguments are included in it. Here are two different approaches to using it for a usage message:

首先,你可以在格式字符串中包含整个消息:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n"

注意,与echo不同,必须显式地包含最后的换行符。此外,如果消息碰巧包含%字符,则必须将它们写成%%。如果你想包含bugreport和主页地址,它们可以很自然地添加:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage"

其次,你可以使用format字符串让它在单独的行中打印每个额外的参数:

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

使用这个选项,添加bugreport和主页地址是相当明显的:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage"

我通常使用内置的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"
    You can write your
    text
        freely,
                   in a separate: 
                             ----file.

然后

echo "$(</pathto/your_multiline_file)"

同样,对于缩进的源代码,您可以使用<<-(带末尾破折号)来忽略前面的制表符(但不能忽略前面的空格)。

比如这个:

if [ some test ]; then
    cat <<- xx
        line1
        line2
xx
fi

输出不带前导空格的缩进文本:

line1
line2