Bash EOF有意想不到的行为

时间:2010-11-25 17:29:12

标签: linux bash eof

我使用快速而肮脏的BASH脚本来自动执行CF分区过程 这很有效,直到我想添加它。

基本上,我有一个脚本可以分割紧凑型闪存:

CMD=.fdisk
DEV=/dev/sdc

echo "Calculating partition sizes..."
P1SIZE=+1100M
P2SIZE=+1200M

echo "Creating instruction file..."
PT1="n p 1\n $P1SIZE"
PT2="n p 2\n $P2SIZE"
END="a 1 w EOF\n"

[ -e $CMD ] && rm -rf $CMD

for i in $PT1 $PT2 $END; do echo -e $i >> $CMD; done

echo "Creating partitions..."
fdisk $DEV << EOF < $CMD
[ -e $CMD ] && rm -f $CMD

我们的想法是,将来由'$ CMD'表示的文件将由具有正确开始和结束值的外部工具自动创建。现在我只接受默认的开始并提供一个大小。

这很有效,直到我想在我的脚本中加入一些额外的步骤。但是当我注意到奇怪的行为时,我遇到了问题。

首先,如果我在函数中添加上面的代码,我将继续收到脚本错误:

line XX: syntax error: unexpected end of file

另外,我意识到'fdisk'命令之后的任何其他代码都不会执行,脚本似乎只是终止(没有错误,$?= 0)。

有谁知道为什么函数不起作用并且脚本终止?

2 个答案:

答案 0 :(得分:4)

经验法则是你使用的'限制字符串'(在我的情况下我使用'EOF',但你可以使用你想要的任何东西)前面不能有空格(或标签)。如果确实如此,则不会被视为结束。

示例:

myFunction() {
    cat << EOF
        Hello
        World
        EOF
}

上面的'EOF'被认为是普通文本,因为它前面有空格!如果您改为编写以下内容:

myFunction() {
    cat << EOF
        Hello
        World
EOF
}

它现在可以使用了!

如果你坚持使用空格,那么你可以在'&lt;&lt;'的右边使用' - '字符来抑制标签。字符。

示例:

myFunction() {
    cat <<- EOF
        Hello
        World
        EOF
}

请注意,这仅适用于标签而非空格!这样可以使您的代码更具可读性。

另请注意,如果引用“限制字符串”,则最终会禁用参数替换。因此,如果您想要编写不应替换或执行的文本,这可以实现:

cat << "EOF"
    Type `ls -la` at the command prompt
EOF

答案 1 :(得分:3)

你已经开始了一个heredoc(<< EOF),但你永远不会在任何地方结束。