如何在不使用多个echo调用的情况下在Bash中输出多行字符串,如下所示:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种可移植的方式,只使用Bash内置.
Pau*_*ce. 251
这里文件通常用于此目的.
cat << EOF
usage: up [--level <n>| -n <levels>][--help][--version]
Report bugs to:
up home page:
EOF
Run Code Online (Sandbox Code Playgroud)
它们在所有Bourne派生的shell中都受支持,包括所有版本的Bash.
小智 161
或者你可以这样做:
echo "usage: up [--level <n>| -n <levels>][--help][--version]
Report bugs to:
up home page: "
Run Code Online (Sandbox Code Playgroud)
Jor*_*rge 23
受到这个页面上富有洞察力的答案的启发,我创建了一种混合方法,我认为这种方法最简单,更灵活.你怎么看?
首先,我在变量中定义用法,这允许我在不同的上下文中重用它.格式非常简单,几乎所见即所得,无需添加任何控制字符.这对我来说似乎相当便携(我在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
"
Run Code Online (Sandbox Code Playgroud)
然后我可以简单地使用它
echo "$__usage"
Run Code Online (Sandbox Code Playgroud)
甚至更好,在解析参数时,我可以在一个单行中回显它:
levelN=${2:?"--level: n is required!""${__usage}"}
Run Code Online (Sandbox Code Playgroud)
nha*_*tdh 22
使用-e选项,然后您可以\n在字符串中打印新行字符.
样品(但不确定是否好的)
有趣的是,该-e选项未在MacOS的手册页中记录,但仍可使用.它记录在Linux的手册页中.
Gor*_*son 21
自从我printf在评论中推荐以来,我应该举一些它的用法示例(虽然打印用法消息,我更有可能使用Dennis'或Chris'的答案). printf比使用起来有点复杂echo.它的第一个参数是一个格式字符串,其中escapes(like \n)总是被解释; 它还可以包含以...开头的格式指令%,它控制在其中包含任何其他参数的位置和方式.以下是将其用于使用消息的两种不同方法:
首先,您可以在格式字符串中包含整个消息:
printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n"
Run Code Online (Sandbox Code Playgroud)
请注意,与之不同echo,您必须明确包含最终换行符.此外,如果消息恰好包含任何%字符,则必须将其写为%%.如果您想要包含bug报告和主页地址,可以很自然地添加它们:
printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage"
Run Code Online (Sandbox Code Playgroud)
其次,您可以使用格式字符串使其在单独的行上打印每个附加参数:
printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: "
Run Code Online (Sandbox Code Playgroud)
使用此选项,添加bug报告和主页地址是相当明显的:
printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage"
Run Code Online (Sandbox Code Playgroud)
使用 -e 参数和转义字符 \n:
echo -e "This will generate a next line \nThis new line is the result"
Run Code Online (Sandbox Code Playgroud)
我通常使用内置的 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"
Run Code Online (Sandbox Code Playgroud)
同样,对于缩进的源代码,您可以使用<<-(带短划线)忽略前导制表符(但不能忽略前导空格)。例如:
if [ some test ]; then
cat <<- xx
line1
line2
xx
fi
Run Code Online (Sandbox Code Playgroud)
输出缩进的文本,不带前导空格:
line1
line2
Run Code Online (Sandbox Code Playgroud)
另一件事是,使用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"
Run Code Online (Sandbox Code Playgroud)
此 ^^^ 将打印整个消息,并插入附加变量,而不是%s按提供的顺序。