这里我试图在bash
中声明一个具有多行值的变量:
$ GET="$(cat <<EOF
> GET / HTTP/1.1
> Host: 127.0.0.1:80
>
> EOF
> )"
这确实有效,但是文档末尾的空白行丢失了:
$ echo "$GET"
GET / HTTP/1.1
Host: 127.0.0.1:80
$ cat <<< "$GET"
GET / HTTP/1.1
Host: 127.0.0.1:80
答案 0 :(得分:2)
实际上并不是修剪尾随换行符的heredoc,而是命令替换。请考虑使用read
代替:
$ IFS= read -r -d '' var << EOF
> hello
> world
>
> EOF
$ printf "%s" "$var"
hello
world
$
请注意,printf
通常不会打印尾随换行符,因此变量var
实际上有两个尾随换行符。
另外,您可以简单地使用多行字符串:
var=" hello
world
"
答案 1 :(得分:1)
命令替换$( )
在分配给变量时自动删除尾随换行符
所以你还需要一个工作来在你的代码中使用heredoc,就像这样
$ GET=$(cat <<EOF
GET / HTTP/1.1
Host: 127.0.0.1:80
. # end with period for preserve trailing newlines
EOF
)
$ GET=${GET%.} # remove period
答案 2 :(得分:0)
我今天正在做这样的事情。使用heredoc创建文件。 该文件一直以一行大行结尾。解决方案是用双引号将要回显的变量加到文件中。
base_name_no_extension="DEMO"
DEMO_C99_CODE=$(cat << DEMO_C99_CODE_HERE_DOC
//////////////////////////////////////////////////
#include "GLEB_SWIN.H" //
//
int //
main( //
void //
){ //
//
GLEB_SWIN_Demonstration(); //
//
} //
//////////////////////////////////////////////////
DEMO_C99_CODE_HERE_DOC
)
touch $base_name_no_extension.C99
> $base_name_no_extension.C99
echo "$DEMO_C99_CODE" >> $base_name_no_extension.C99
##
######
##########
##############
##################
####
####
####
####
####
####
#########################
## ##
## DOUBLE QUOTES! ##
## ##
#########################