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}
答案 0 :(得分:2)
简短回答使用cat -A
并确保EOF
与该行末尾之间没有空格。
关于here-doc
的两件事:
确保线路在您选择的字符串EOF
之后直接结束,但它可以是任何内容。
-
中的 cat <<-EOF
允许缩进,因此行可以以制表符开头,并且不会打印这些制表符。
示例:
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)