レッドハットリナックス8.0でのIFS変数について

このQ&Aのポイント
  • IFS変数について詳しく教えてください。私はレッドハットリナックス8.0を使用しています。IFS変数は単語の区切りを認識する変数で、空白とタブと改行が初期値として設定されています。しかし、他の文字を代入することもできます。
  • スクリプトを実行すると、指定した区切り文字で文字列を区切り、変数に代入することができます。ただし、レッドハットリナックス8.0ではスクリプト実行時に区切り文字が空白に変換されてしまうようです。これは環境の違いによるものかもしれません。他の書き方や設定方法を試してみることをおすすめします。
  • レッドハットリナックス8.0でのIFS変数についての問題に困っている方は、より詳しい情報を提供することで解決策を提案できるかもしれません。質問内容をもう一度確認して、必要な情報を含めて質問してみてください。
回答を見る
  • ベストアンサー

IFS変数について詳しい方教えて!!

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

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.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の引数の分割時にされていたわけです。 読んだ本が悪かったようですね。

zyousuke
質問者

お礼

notnotさん、ご返信ありがとうございます。 よく分かりました。 確かに構文解析時にIFSが使われるのだとしたら、 この本のように空白と/が混在した文は予期しない結果になってしまいますものね。 これは読者の評価欄を見てじっくり吟味して選んだ本なので残念です! 恐らくこの本の作者はスクリプトを実行せずに自信満々で掲載してしまったのでしょうね。 さらに、これは翻訳された本なので、翻訳者も間違えに気づかず、そのまま翻訳してしまったということだと思います。 私は信じ込みやすい正確なので、本が間違っているとなかなか解決できず、一苦労です!

関連するQ&A

  • 変数の定義について

    perl中級者です。 とあるPGMの修正を頼まれて行っていたのですが、 変数の定義において print "$ABC{$DEF}\n" という記述がありました。 $ABC$DEF や $ABC[$DEF]、 $ABC${DEF} という記述は使用しますが、 $ABC{$DEF} のような記述ってあるのでしょうか? 前後の処理は関係無しにこのような表現があるのかどうかを教えてください。 また、その場合print等で表現すると、 どのような表示になるのでしょうか? perl:Ver4 開発環境:HP-UX 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 変数に「.」が含まれる場合...

    例えば・・・ Dim ABC As String '変数ABC の型宣言 ABC = "1.0" DEF = "522" …とまぁ、こんな感じの時。(文法とか、いいかげん) 変数ABCに「.」が含まれている時といない時に 特定の動作をさせたいんです。 変数ABC「.」が含まれていない時 ABC = DEF 「.」が含まれている時 「.」より右の数字を消して ABC & DEF Select Case、もしくはIF文を使って動作させる予定です 変数は、3文字限定です。それと、「.」の位置は 左か真ん中になることもあります。 例)ABC = .12 ABC = 0.1   ABC = 012 …なんとなく、Format関数を使ったら できそうな気がするんですが…。

  • 変数にHTMLを代入する場合

    ただの文字列であれば $html = "abc"; で代入できますが、 たとえば$htmlという変数に 「 <a href="$url">$url</a> 」 という文字列を代入する場合にはどうすれば良いんでしょうか? もちろん$urlは変数名ではなく、代入された文字列を表示します。 (例:$url = "http://#/")

    • ベストアンサー
    • PHP
  • 空白を含んだシェル変数の代入

    こんにちは。 空白を含んだシェル変数の代入について教えてください。 set test1="ABCD EFGHIJ" set w1=$test1 echo "w1 = $w1" このようなシェルスクリプトを実行させた時 w1 = ABCD と表示されてしまいます。 解決案があれば教えてください。 よろしくお願いします。

  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • bashで変数にパイプを入れ、コマンドとして使う?

    パイプを含む文字列が入った変数をシェルコマンドとして実行する方法がありましたら 教えてください。 Linux環境で、bashを使って定期的にモニタリングするスクリプトを書こうとしています。 スクリプトの引数で実行するモニタリングコマンドを変えれるようにしたいのですが、 パイプが入っているとうまくいきません。 下記のようなスクリプトで、引数に "ps -ef | grep pty" と入れたら、定期的に そのようなコマンドを実行できるようにできますでしょうか? (引数指定時に、きちんとクォーテーションで全体を囲んで、パイプが評価されない ようにしてもダメでした。) 変数として入ったコマンドを実行するときに、パイプがシングルクォーテーションで 囲まれて "ps -ef '|' grep pty" のようになってしまい、パイプとして実行時に認識 されないようです。 bashシェルで設けてる制約でしょうか?回避策などありますでしょうか? <<スクリプト poll.sh>> ## # Defs export RUNCMD='finger' export INTERVAL=10 ## # Getopt while getopts "t:" OPT; do case ${OPT} in t) INTERVAL=${OPTARG};; esac done shift $((OPTIND-1)) [ ${#} -gt 0 ] && RUNCMD="${*}" ## # Main part while :; do (set -x; ${RUNCMD}; sleep ${INTERVAL}); done

  • C++で、環境変数の読み込み方を教えて下さい(Linux)

    Linux(Red Hat Enterprise)環境で、C++でライブラリを作ろうとしていますが、環境変数の受け取り方がわかりません。調べてみたところ、Windows(VC++)のものしか見つけることができませんでした。LinuxのC++で、環境変数を受け取る方法を教えて下さい。

  • Javascriptのエラー

    HPのurlが代入されているPerlの変数$urlをJavascriptに引数として渡し、HPを別ウインドウに表示したいのですが、 エラー ')'が抜けているとなりエラーになります <SCRIPT LANGUAGE="JavaScript"> <!-- function abc(def) { new1 = window.open("def", "", "width=400, height=310"); new1.moveTo(0,0); new1.document.close(); } //--> </SCRIPT> <A HREF=\"javascript:abc($url)\">別ウィンドウに表示</A> 何処が間違っているのですか。

  • HTMLについて

    HTMLについて分からない事がありますので、ご教授願います。 <INPUT TYPE=TEXT NAME=TEST VALUE="abc"def"> 上記のように、テキストボックスに「abc"edf」を初期表示させる1文を書きました。 しかし、「abc」しかテキストボックスには初期表示されません。 原因は「abc」の次にある「"」がVALUEに代入する文字列の最後とみなされている ためなのですが、文字列中の「"」を文字として認識させて「abc"def」と初期表示 させたいのですが、何か良い方法はないでしょうか? 実は、powerscriptでプログラミングをしています。 そのため、VALUEに指定する文字列は変数を指定していますので、 「VALUE=''」にしてもその変数に「'」が入力されていたら同じ現象が生じてしまいます。 なんとか、「"」を文字として認識させる方法はないのでしょうか?

  • 特殊文字入りの文字結合を、変数にできますか?

    ●perl $seireki = "2013";     # 変数 #------------- $123 = "$seireki";     # 代入 $nengou = "$abc"."$123"; # 結合 #------------- $abc2013 = <<"EOF"; あいうえお EOF $abc2014 = <<"EOF"; かきくけこ EOF #------------- ●html <strong>$nengou</strong> ーーーーーーーーーーーーーーーーーーー 上記、htmlの$nengouに あいうえお と表示したいのですが、 2013 と表示されてしまいます。 解決法として、 $は特殊文字なので、エスケープシーケンス(¥$)をして、 $nengou = "¥$abc"."123"; にしたら、 htmlの中の$nengouは、$abc2013 と表示されてしまいます。 どのようにしたら、 特殊文字入りの文字結合を、変数として扱うようにするのでしょうか? いろいろ試してみてもどうしても出来ません。 どなたか解決していただけますと、ありがたいです。

    • ベストアンサー
    • Perl