-1

CF パーティショニング プロセスを自動化するために、簡単で汚い BASH スクリプトを使用していました。
追加したくなるまで、これはうまくいきました。

基本的に、コンパクト フラッシュを次のように分割するスクリプトがあります。

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」で表されるファイルが、適切な開始値と終了値を持つ外部ツールによって自動的に作成されるということです。今は、デフォルトの開始を受け入れて、サイズを指定するだけです。

これは、スクリプトにいくつかの追加ステップを組み込みたいと思うまでは、非常にうまく機能しました。しかし、奇妙な行動に気づいたときに問題が発生しました。

1 つ目は、上記のコードを関数内に追加すると、スクリプト エラーが発生し続けることです。

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

ヒアドキュメント ( << EOF) を開始しましたが、どこでも終了していません。

于 2010-11-25T17:32:02.030 に答える