使用bash脚本中的here-document命令创建文件

问题描述 投票:0回答:2

如何使用

cat
命令以及 shell 脚本内的此处文档创建文件”

#!/bin/bash

create_file () {
    cat > a.txt << EOF
    0 abc def 
    ghi jkl mno
    pqrs tuv wxyz
    EOF
}

create_file

错误

Syntax error: end of file unexpected (expecting "}")
bash shell
2个回答
2
投票

打开EOF后删除缩进:

#!/bin/bash

create_file () {
    cat > a.txt <<EOF
0 abc def 
ghi jkl mno
pqrs tuv wxyz
EOF
}

create_file

Bash 会查找与您开始时相同的“分隔符”。您以“EOF”开头,但在使用缩进时以“____EOF”结尾,因此它无法匹配结束分隔符

如果要为结果文本添加间距,请向文本添加缩进,但将 EOF 保留在行首:

#!/bin/bash

create_file () {
    cat > a.txt <<EOF
  0 abc def 
  ghi jkl mno
  pqrs tuv wxyz
EOF
}

create_file


0
投票

此处文档结束的行必须与您在此处文档开头指定的字符串完全匹配。因此,您可以清楚地缩进代码,执行以下操作:

  1. 向起始字符串添加 4 个空格缩进,使其与结束行的内容完全匹配。
  2. 通过制表符缩进此处文档的内容,以便更清楚此处文档的内容。
  3. -
    之后添加
    <<
    以告诉 bash 忽略此处文档中的前导制表符(并且仅是制表符,而不是所有空格):

#!/bin/bash

create_file () {
    cat > a.txt <<- '    EOF'
        0 abc def 
        ghi jkl mno
        pqrs tuv wxyz
    EOF
}

create_file

所以上面的这里文档中重要的空格被拼写出来是:

cat > a.txt <<- '<blank><blank><blank><blank>EOF'
<tab>0 abc def 
<tab>ghi jkl mno
<tab>pqrs tuv wxyz
<blank><blank><blank><blank>EOF

它将创建这个没有前导空格的文件:

0 abc def 
ghi jkl mno
pqrs tuv wxyz

如果您复制/粘贴上面的内容并输出一个带有前导空格的文件,那是因为您忘记将该网站在此处文档中显示的空白转换为真实代码的制表符。

© www.soinside.com 2019 - 2024. All rights reserved.