如何在不使用多个echo调用的情况下在Bash中输出多行字符串:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
寻找便携式方法,只使用Bash内置。
答案 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”。