(bash)用cat将多行文本缩进到$ VAR?

时间:2015-04-03 15:08:49

标签: linux bash eof heredoc

OS: Debian 7 Wheezy GNU \ Linux
语言: Bash
已审核的文件: wiki/heredoc

什么有效:

cat > software.temp <<- EOF 
gparted 
baobab 
EOF 

什么不

prefer="/etc/apt/preferences.d/${reponame}"
cat <<- EOF >> ${prefer}
Package: *
Pin: release l=Debian
Pin-Priority: 110
EOF

是的,我知道这是相反的,这可能是我没有让它发挥作用。基本上老了“找不到EOF”的错误。请注意上面的每个块都缩进,TAB一次或多次。您可以看到我的代码here。我想知道是不是因为我试图指导输入/输出。

我可能会想到类似下面的内容,但这也不起作用。

cat <<- EOF 
Package: *
Pin: release l=Debian
Pin-Priority: 110
EOF >> ${prefer}

1 个答案:

答案 0 :(得分:2)

简短回答使用cat -A并确保EOF与该行末尾之间没有空格。


关于here-doc的两件事:

  1. 确保线路在您选择的字符串EOF之后直接结束,但它可以是任何内容。

  2. -中的
  3. cat <<-EOF允许缩进,因此行可以以制表符开头,并且不会打印这些制表符。

  4. 示例:

    tiago@dell:/tmp$ cat test1.sh
    #!/bin/bash
    cat << EOF
    Hello here-doc
    EOF
    
    tiago@dell:/tmp$ cat test2.sh
    #!/bin/bash
    cat << EOF
    Hello here-doc
    EOF 
    
    tiago@dell:/tmp$ bash test1.sh
    Hello here-doc
    
    tiago@dell:/tmp$ bash test2.sh
    test2.sh: line 4: warning: here-document at line 2 delimited by end-of-file (wanted `EOF')
    Hello here-doc
    EOF 
    

    这两个文件看起来完全相同但在test2.sh上有一个EOF之后的空格,在文本编辑器中无法注意到,但你可以使用cat -A

    tiago@dell:/tmp$ cat -A test1.sh
    #!/bin/bash$
    cat << EOF$
    Hello here-doc$
    EOF$
    
    tiago@dell:/tmp$ cat -A test2.sh
    #!/bin/bash$
    cat << EOF$
    Hello here-doc$
    EOF $
    

    现在WRT缩进:

    tiago@dell:/tmp$ cat test3.sh 
    #!/bin/bash
    cat << EOF
        Hello here-doc
    EOF
    
    cat <<-EOF 
        Hello here-doc (Indentation ignored)
    EOF
    
    tiago@dell:/tmp$ bash test3.sh
        Hello here-doc
    Hello here-doc (Indentation ignored)