Heredoc没有保留空白行

时间:2016-06-08 15:20:32

标签: bash

这里我试图在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

3 个答案:

答案 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!   ##
    ##                     ##
    #########################