我如何在Bash中输出一个多重字符串,而不使用多个echo调用,像这样:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
我正在寻找一种可移植的方法来做到这一点,只使用Bash内置程序。
我如何在Bash中输出一个多重字符串,而不使用多个echo调用,像这样:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
我正在寻找一种可移植的方法来做到这一点,只使用Bash内置程序。
当前回答
还有一件事,使用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。
其他回答
我通常使用内置的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"
还有一件事,使用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。
受到本页上富有洞察力的回答的启发,我创造了一个混合的方法,我认为这是最简单和更灵活的方法。你怎么看?
首先,我在一个变量中定义了它的用法,这允许我在不同的上下文中重用它。格式非常简单,几乎是所见即所得,不需要添加任何控制字符。对我来说,这似乎是合理的可移植性(我在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}"}
同样,对于缩进的源代码,您可以使用<<-(带末尾破折号)来忽略前面的制表符(但不能忽略前面的空格)。
比如这个:
if [ some test ]; then
cat <<- xx
line1
line2
xx
fi
输出不带前导空格的缩进文本:
line1
line2
这样做:
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部分。