奇怪的猫行为

时间:2014-07-17 13:47:25

标签: bash function eof cat

在函数内部,我会有多个回声,但我记得我可以做cat << EOF后跟我的文本输出,然后是EOF。但是,当EOF部分没有缩进时,它似乎只能工作,就像这样

init(){
    if [ conditionial ]; then
        cat << EOF
        this is some text
        this is more text
        this is even more text

EOF

但它不能像这样工作:

init(){ if [ conditionial ]; then cat << EOF this is some text this is more text this is even more text EOF

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

&#34;这里是文件&#34;终止符必须出现在行的开头,除非重定向运算符具有-后缀:

cat << END
this does not
  END
here, but rather here
END

VS

cat <<- END
this one does end here
        END

(注意空格与制表符;以及一些较旧的shell变体不支持此功能。)

除此之外,另一个有用的技巧是处理这里文档中的扩展。如果引用结尾字(我上面示例中的END,您的EOF),则会禁止扩展:

cat << E1
you are in a maze of twisty little directories: $PWD
E1
cat << 'E2'
you owe the Usenet Oracle $1.75 for the Tab.
E2

答案 1 :(得分:0)

在你问过之前我从来不知道这一点,但你可以使用<<-(注意-)忽略前导标签(不是空格)。

请参阅here

答案 2 :(得分:0)

EOF必须在行的开头,并且它之后没有任何内容但是行尾:

#! /bin/bash
function say_hello {
        cat << EOF
        hello
        world
EOF
} 

执行:

bash test.sh
        hello
        world

仔细研究cat -A

cat -A  test.sh
#! /bin/bash$
$
function say_hello {$
^Icat << EOF$
^Ihello$
^Iworld$
EOF$
}$
$
say_hello$

我的脚本问题在EOF之后会有空格而不起作用,只有cat -A我可以识别空间。