【问题标题】:Bash EOF has unexpected behaviorBash EOF 具有意外行为
【发布时间】:2010-11-25 17:29:11
【问题描述】:

我正在使用一个快速而肮脏的 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)。

有谁知道为什么函数不工作而脚本终止?

【问题讨论】:

  • 路过的投票者很讨厌,但它们会发生;最好习惯它。如果您认为自己受到攻击(很多反对票),请联系团队或询问元数据。他们可能是一个失败者,他们的反对票可能比你想要的更宽松,但你最好忽略他们。 (可悲,不过如此。)

标签: linux bash eof


【解决方案1】:

一个经验法则是,您使用的“限制字符串”(我使用的是“EOF”,但您可以使用任何您想要的东西)前面不能有空格(或制表符)。如果是这样,它不会被认为是结束。

例子:

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

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

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

它现在可以工作了!

如果您坚持使用空格,则可以通过在“

例子:

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

请注意,这仅适用于制表符,不适用于空格!这可以让您的代码更具可读性。

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

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

【讨论】:

  • 哇,我以为我快疯了,直到我看到这篇文章。删除前缀 EOF 的任何空格为我解决了意外的文件结尾错误。
【解决方案2】:

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

【讨论】:

  • 我明白我现在做错了什么!虽然我的命令文件中有 'EOF' 限制字符串,但 bash 想要在该特定脚本中找到它,而不是在其他地方。我写了一个答案,描述了如何使它适用于我的情况。感谢您指出这一点!
最近更新 更多