dポイントプレゼントキャンペーン実施中!

IFS変数というのを学習しました。
これは単語の区切りを認識する変数で、最初は空白とタブと改行が入っているのですが、他の文字を代入することもできるということまでは理解しました。
例として次のスクリプトが掲載されていました。
IFS=/
for i in /abc///def/
do
echo $i
done
このスクリプトを実行すると
変数iにabc、defが順に代入され
最終的に標準出力へ
abc
def
を表示するのだそうですが、
私の環境で全く同じスクリプトを作成して実行したところ
abc def
と表示されました。
/が空白に変換されて表示されるのはよいのですが、
どうも変数iに一気に全部の文字を代入してしまっている感じがします。
何度も見直したので、写し間違えてはいないと思うのです。
リナックスには色々な種類があるので、私の環境ではもっと別の書き方をする必要があるのでは、とも考えています。
私はレッドハットリナックス8.0を使用しています。
どなたか、お暇な時にでも助言をお願いします。

A 回答 (1件)

これはbashの機能なので、ディストリビューションによる違いはまず無いでしょう。



構文の解析時にはIFSは使われません。もし使われるとしたら、IFS=/ としたら、
for/i/in/a/b/c;do/echo/$i/;done
などと書かなければならなくなります。

IFS=/
for i in /abc///def/;do echo "$i";done
とすればiには文字列がそのまま読み込まれていることが分かると思います。IFSによる分解はechoの引数の分割時にされていたわけです。

読んだ本が悪かったようですね。
    • good
    • 0
この回答へのお礼

notnotさん、ご返信ありがとうございます。
よく分かりました。
確かに構文解析時にIFSが使われるのだとしたら、
この本のように空白と/が混在した文は予期しない結果になってしまいますものね。

これは読者の評価欄を見てじっくり吟味して選んだ本なので残念です!
恐らくこの本の作者はスクリプトを実行せずに自信満々で掲載してしまったのでしょうね。
さらに、これは翻訳された本なので、翻訳者も間違えに気づかず、そのまま翻訳してしまったということだと思います。
私は信じ込みやすい正確なので、本が間違っているとなかなか解決できず、一苦労です!

お礼日時:2006/09/06 09:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!