-1

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

有谁知道为什么该功能不起作用并且脚本终止?

4

2 回答 2

4

一个经验法则是,您使用的“限制字符串”(在我的例子中我使用的是“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
于 2010-11-26T04:53:22.647 回答
3

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

于 2010-11-25T17:32:02.030 回答