2010-11-25 6 views
-1

私は、CFパーティショニングプロセスを自動化するために素早く汚れたBASHスクリプトを使用していました。
これは私がそれに追加したいときまでうまくいきました。Bash EOFの予期しない動作があります

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

ドライブバイダウンローダーは迷惑ですが、それに慣れるのが一番です。あなたが攻撃を受けていると思うなら(downvotesがたくさんあります)、チームに連絡を取ったり、メタについて聞いてみてください。そして、彼らは敗者かもしれないし、彼らはあなたが望むよりも彼らのdownvotesで緩いかもしれませんが、あなたはそれらを無視して最善です。 (悲しい、だけど) –

答えて

3

あなたはヘレドック(<< EOF)を開始しましたが、どこでも終了することはありません。

+0

私は今何が間違っていたのか理解しています!私はコマンドファイルに 'EOF'制限文字列を持っていましたが、bashはその特定のスクリプト内でそれを見つけたいと思います。私は私の場合にそれを動作させる方法を記述した答えを書いた。それを指摘してくれてありがとう! – Jeach

4

あなたが使用している「制限文字列」(私の場合は「EOF」を使用していましたが、必要なものは使用できます)の前に空白(またはタブ)を入れてはいけません。もしそうなら、それは終わりとはみなされません。

例:それはそれの前にスペースを持っているので、「EOF」が上記の通常のテキストとみなされ

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

!代わりに次のように書くと:

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

これで機能します。

空白の使用を主張する場合は、 '< <'文字のすぐ右に ' - '文字を使用してタブを非表示にすることができます。

例:

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

なお、このタブのみのための作品ではなく、スペース!これはあなたのコードをもっと読みやすくするのに最適です。

また、「制限文字列」を引用すると、パラメータ置換が無効になります。したがって、置換または実行すべきではないテキストを書きたい場合は、次のようにすることができます。

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

うわー、私はこの投稿を見るまで狂ったと思った。 EOFの前に空白を削除すると、予期しないファイルエラーの終了が解決されました。 –

関連する問題