旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

for文へのリストに”/*”とかが入ってしまうとき

2007年4月13日

shのシェルスクリプトの話です。
for文に渡すリストの各要素にシェルの特殊文字が入った場合の
エスケープの方法がわからないっす。
例えば以下のファイルがあったとして

--- cat.txt ---
/**
 * COMMENTS
 */
src;
--- for.sh ---
#!/bin/sh
for i in `cat cat.txt`
do
    echo "$i"
done
それで foo.sh を実行すると
for文に渡される最初の /** がシェルの特殊文字として動作するので
ルート以下のディレクトリ一覧が $i に入ってfor文でループしたりします。

かといって、”`cat cat.txt`”と全体をエスケープすると
今度は改行等がリストの切れ目として認識されずに、ループが1回しか行われません。
(これはこれで理由が良くわからないんだが)

$i に分解したタイミングでエスケープするのはどうすりゃいいんだろう?

畜生、2時間ぐらいはまってる、別言語を使えばよかった・・・。