我使用快速而肮脏的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)。
有谁知道为什么函数不起作用并且脚本终止?
答案 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
),但你永远不会在任何地方结束。