Re: Variable expansion at definition time
しらいです。
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 でなくても「;」を使うように習慣
づけておくといいんじゃないでしょうか。
--
しらい たかし
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735