しらいです。

 Bourne shell の文法仕様ってそんなに難しいでしょうか?

In article <YAS.06Dec22204927@kirk.is.tsukuba.ac.jp>,
Yasushi Shinjo <yas@is.tsukuba.ac.jp> wrote:
>新城@筑波大学情報です。

>------------------------------------------------------------
>$ x="file1 file2"
>$ y="10 20"
>$ eval `cat <<EOF
>> echo_xy()
>> {
>> echo "$x,\$y"
>> }
>> EOF`
>bash: syntax error: unexpected end of file
>$
>------------------------------------------------------------
>あれ。うまく行かない。

 Bourne shell 仕様に於いて、コマンド引数に含まれる改行は保
存されずに field separator として shell が評価してしまいます。
これは eval のような内部コマンドでも同じです。
 このため、コマンドに改行を渡すには、「\」で escape するか
「''」や「""」で quote する必要があります。「``」では quote
したことになりません。
 このことは以下の例で確認出来ると思います。
------------------------------------------------------------
$ echo `printf '1\n2\n3'`
1 2 3
$ echo "`printf '1\n2\n3'`"
1
2
3
$ 
------------------------------------------------------------

 即ち、先の eval の引数は eval に渡された時点で以下のように
置換えられてしまっています。
------------------------------------------------------------
echo_xy() { echo "$x,$y" }
------------------------------------------------------------
 見て判る通り、「;」が足りないので文法エラーになりますね。
「{}」の中身は必ず「;」か改行で終わっていけないというのが文
法仕様ですから。
 ついでに言うと、「``」の中では「\」も評価されて消えてしま
うので、期待した結果を得るにはもう一個「\」が必要です。

 という訳で、以下のように記述すればうまくいく筈です。
------------------------------------------------------------
$ x="file1 file2"
$ y="10 20"
$ eval `cat <<EOF
> echo_xy()
> {
> echo "$x,\\$y";
> }
> EOF`
$ x="file3 file4"
$ y="30 40"
$ echo_xy
file1 file2,30 40
$ 
------------------------------------------------------------
 このように、Bourne shell に於いて改行は完全に「;」の代替と
なる訳ではないので、1 liner でなくても「;」を使うように習慣
づけておくといいんじゃないでしょうか。

-- 
                                               しらい たかし