如何在Bash中输出多行字符串?

时间:2012-06-10 15:27:16

标签: bash

如何在不使用多个echo调用的情况下在Bash中输出多行字符串:

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

寻找便携式方法,只使用Bash内置。

10 个答案:

答案 0 :(得分:212)

此处文件通常用于此目的。

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

Report bugs to: 
up home page:
EOF

所有Bourne派生的shell都支持它们,包括所有版本的Bash。

答案 1 :(得分:141)

或者你可以这样做:

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

Report bugs to: 
up home page: "

答案 2 :(得分:19)

由于我在评论中推荐printf,我应该举一些例子来说明它的用法(虽然打印用法信息,我更有可能使用Dennis'或Chris'的答案)。使用printf比使用echo要复杂一点。它的第一个参数是格式字符串,其中转义(如\n总是解释;它还可以包含以%开头的格式指令,它控制在其中包含任何其他参数的位置和方式。以下是将其用于使用消息的两种不同方法:

首先,您可以将整个邮件包含在格式字符串中:

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

请注意,与echo不同,您必须明确包含最终换行符。此外,如果邮件恰好包含任何%个字符,则必须将其写为%%。如果你想要包含bug报告和主页地址,可以很自然地添加它们:

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

其次,您可以使用格式字符串使其在单独的行上打印每个附加参数:

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

使用此选项,添加bug报告和主页地址非常明显:

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

答案 3 :(得分:17)

使用-e选项,然后您可以在字符串中打印带\n的换行符。

Sample(但不确定是否是好的)

有趣的是-e选项未在MacOS's man page中记录,但仍可使用。它记录在man page of Linux

答案 4 :(得分:13)

受此页面有见地的答案的启发,我创建了一种混合方法,我认为这是最简单,更灵活的方法。你觉得呢?

首先,我在变量中定义用法,这使我可以在不同的上下文中重用它。格式非常简单,几乎就是所见即所得,无需添加任何控制字符。对我来说,这似乎是可移植的(我在MacOS和Ubuntu上运行了它)

__usage="
Usage: $(basename $0) [OPTIONS]

Options:
  -l, --level <n>              Something something something level
  -n, --nnnnn <levels>         Something something something n
  -h, --help                   Something something something help
  -v, --version                Something something something version
"

然后我可以简单地将其用作

echo "$__usage"

甚至更好的是,在解析参数时,我可以单线在其中回显它:

levelN=${2:?"--level: n is required!""${__usage}"}

答案 5 :(得分:5)

我通常使用内置的 read 命令,我认为它更灵活和直观。 它将一行的内容读入一个变量,并允许与特殊的 shell 变量 IFS 相关的分词。 有关详细信息,请参阅此 blog 或什至手册页。

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"

答案 6 :(得分:3)

此外,对于缩进的源代码,您可以使用&lt;&lt; - (带尾部短划线)来忽略前导标签或空格。例如:

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

输出没有前导空格的缩进文本:

line1
line2

答案 7 :(得分:3)

如果使用@jorge提供的解决方案,并且发现所有内容都在同一行中,请确保将变量用引号引起来:

echo $__usage

将所有内容打印在一行上,而

echo "$__usage"

将保留换行符。

答案 8 :(得分:1)

使用-e参数和转义字符\ n:

echo -e "This will generate a next line \nThis new line is the result"

答案 9 :(得分:1)

还有一件事,使用 printf 和预定义的 var 作为模板。

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"

此 ^^^ 将打印整条消息,并按提供的顺序插入附加变量而不是“%s”。