変数の扱いについて

このQ&Aのポイント
  • 外部ファイルに記述した変数の文字を変数として認識してくれません。
  • 希望としては「Test 1」という表示をしたいです。
  • 初めまして、仕事で簡単なシェルを作成していますが、変数の扱いに困っています。お知恵をお貸しください。
回答を見る
  • ベストアンサー

変数の扱いについて

初めまして 仕事で簡単なシェルを作成していますが、ちょっと困っています。お分かりになる方がいらっしゃいましたら、お知恵をお貸しください。 外部ファイルとして変数を記述したファイルを作成しました。このファイルの内容を参照し、他で定義した変数を割り当てたいのですが、どうしても外部ファイルに記述した変数の文字を変数として認識してくれません。 書き方がおかしいのでしょうか? $ls MSG.sh MSG.txt ----- $cat MSG.txt Test $MSG1 ----- $cat MSG.sh #!/bin/sh MSG1=1 MSG=`cat MSG.txt` echo $MSG ----- $./MSG.sh $Test $MSG1 <--変数でなく文字として認識されてしまうう。 ---希望としてはこの様に表示して欲しい--- $Test 1 よろしくお願いします。

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

  • ベストアンサー
  • e_watt
  • ベストアンサー率71% (25/35)
回答No.1

eval を使って、$MSG をシェルスクリプトの行のごとく実行(評価)すれば 希望の動作をさせられます。 たとえば、 a) eval echo $MSG b) MSG2=`eval echo $MSG` echo $MSG2 のようにします。 eval $MSG と書くと、 "Test 1" を実行しようとします。 # そしてたぶん「Test なんてコマンドはありませんよ」といった # エラーメッセージを表示することでしょう。

yuyuyu1
質問者

お礼

evalコマンドを使用することによって、希望する動作を実現できました。 ありがとうございました。

関連するQ&A

  • 変数の引き継ぎ(bash)

    bashで開発をしているのですが、 メインの変数より子シェルの変数に引き継ぎをしたいのですが、 どうすればいいのでしょうか。 test.sh #!/bin/bash # 外部変数 sub_test() { echo $1 } # メイン sub_test # test.sh AAA シェルを実行すると、AAAという文字が出てきません。 宜しくお願いします。

  • シェル変数とパイプ

    シェルの変数にパイプを入れた文字列(コマンド)を格納し、それを実行したいのですが、「|」がただの文字として扱われているようでうまく実行できません。 どのように記述すれば、パイプとして認識してくれるのでしょうか? 次のようなことをやりたいのですが、このようにエラーになってしまいます。 # setenv cmd "ls | grep test" # $cmd ls: |: そのようなファイルやディレクトリはありません ls: grep: そのようなファイルやディレクトリはありません ls: test: そのようなファイルやディレクトリはありません

  • shellスクリプトに複数の引数を渡したい

    shellスクリプトに複数の引数を渡したいと考えています。 下記のようなperlスクリプトを兼ねる事でやりたいことは達成できました。 これをシェルスクリプトだけでやろうとしていて、ハマってしまい、やり方がわからなかったので、質問しています。 ・echo.shの中身 $ cat echo.sh echo $1 $2 ・imglist.plの中身 $ cat imglist.pl my@imglist= `ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} 2>1&`; foreach(@imglist){ my@name=split /\./,$_; system("bash ./echo.sh $name[0] $name[1]"); } ・実行すると、無事echo.shに引数が2つ渡る。 $ perl imglist.pl abc1 jpg abc10 png abc11 png abc2 jpg abc3 jpg これをシェルのみでやろうとして、はまってしまいました。 以下は、パイプ処理等を使ったりしてやってみたのですが出来ませんでした。 ・awkでファイル名と拡張子に分解し、パイプで渡そうとしても何故か渡らない・・ $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}'| bash ./echo.sh ・ファイルに一旦保存し、catコマンドでパイプで渡しても駄目 $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}' > imglist.txt $ cat imglist.txt | bash ./echo.sh ・echoコマンドを使ってパイプで渡しても駄目 $ echo `cat imglist.txt` |bash ./echo.sh ・for.shというファイルを作成し、for構文でimglist.txtの中身を渡すと引数が一つずつしか渡らない $ cat for.sh for id in $(cat imglist.txt); do echo $id done $ bash for.sh tile1 jpg tile10 jpg どうやれば、コマンドライン上やシェルスクリプトだけで、今回はファイル名と拡張子という形で複数行からなる2つの引数を渡すことができますでしょうか

    • ベストアンサー
    • Perl
  • bashで変数を含んだファイル読み込み

    お世話になります。 外部読み込みファイルの中に変数やコマンドをセットして利用したいのですが、それはできないのでしょうか? ----test.txt messages-${testdate} `hostname`.log -------------------------- ----test.sh testdate=`date +%Y%m%d` for line in `cat test.txt` do echo $line done -------------------------- ----出力 messages-${testdate} `hostname`.log -------------------------- ----望む出力結果 messages-20150521 servername.log -------------------------- 方法がございましたら、ご教授お願い致します。

  • 標準出力と標準エラー出力を変数にセットしたいです。

    始めたばかりの初心者の為、変な質問でしたら申し訳ありません。 標準出力と標準出力を別々の変数にセットしたいのですが、そのやり方が分からず困っています。 やりたいことは、 コマンド(diffやcatなどの)実行結果の標準出力と標準エラー出力を それぞれ「任意の文字_受取パラメータの値」にセットすることをしたいです。 下記は、1回ファイルに出力して、それを読んで変数にセットするように記述したものです。 ※記述間違っていたらすみません。 ファイルに書かなくても、パイプやその他コマンドなどで出来る方法はないでしょうか? ex) test.sh 1.txt 2.txt TEST01 で実行 #!/bin/sh parm1 = $1 parm2 = $2 parm3 = $3 diff "${parm1}" "${parm2}" > test.log 2> err.log eval w_stdout_${parm3}=¥`cat test.log¥` eval w_stderr_${parm3}=¥`cat err.log¥` eval echo "stdout:¥"¥{w_stdout_${parm3}}¥"" eval echo "stderr:¥"¥{w_stderr_${parm3}}¥"" ※実行した結果 stdout:diff結果 stderr:空白 お手数ですが、何卒宜しくお願い致します。

  • シェルスクリプト コマンドを変数にした時の呼び方

    はじめまして、シェルスクリプトを勉強中の者です。 コマンドを変数にいれて、まとめました。 しかしコマンドの変数を呼びこもうとするとエラーになります。 ============================================ #!/bin/sh GREP="grep" cat "${GREP} '^[0-9]' /home/hoge/test.nicdf" ============================================ ================ シェル実行結果 ============= $ ./test.sh cat: grep '^[0-9]' /home/hoge/test.nicdf: そのようなファイルやディレクトリはありません どう書けば、エラーにならずに正常に動作するでしょうか? ご教授の程よろしくお願いします。

  • ブランクを含む環境変数の置換

    こんにちは。 今、UNIX上でファイルのある文字をある環境変数で置換するようなシェルを作成中です。 そこで、以下のようにsedを使用してみました。 cat AAA.txt |sed s/CurFY/`echo $FY`/g AAA.txtの内容 AAA BBB CurFY この時、環境変数$FYがブランクを含まない値の場合 はうまくCurFYを$FYの値に変更できるのですが、$FYに ブランクが入っていた場合は実行できません。 実行例) setenv FY "ACT 2003" cat AAA.txt |sed s/CurFY/`echo $FY`/g sed: コマンドが正しくありません: s/CurFY/ACT となってしまいます。 何かうまい方法はないでしょうか? どうかアドバイスお願いいたします。

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • Bシェルで不定変数名を変数として取り扱うには

    ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do  FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt

  • アスタリスクを文字列として変数に入れるには

    HP-UX cshで、アスタリスクを文字列として 変数に入れるにはどうしたら良いでしょうか? 現在は <file3の中身> grep -v file*.txt | grep -v file2.txt で、 set hensu=`cat file3.txt`としてecho $hensuすると grep -v file1.txt file2.txt file3.txt | grep -v file2.txt という具合に、アスタリスクがワイルドカードとして 働きます。これを「file*.txt」という文字列として 変数に入れる方法を教えてください。 宜しくお願いします。