exprで四則演算をする際に変数を動的にしたい

このQ&Aのポイント
  • exprを使用して四則演算をする際に、変数を動的にする方法について教えてください。
  • 上記のコードを実行すると、エラーが発生してしまいます。動的な変数を使用した場合、どのように記述すればよいですか?
  • 経過時間をそれぞれ取得するために、exprで動的な変数を使用する方法について教えてください。
回答を見る
  • ベストアンサー

exprで四則演算をする際に変数を動的にしたい

exprで四則演算をする際に変数を動的にした場合の記述法について #!/bin/bash DATA60=`date +%-H%M%S` Old_DATA=$DATA60 jikan=`expr $DATA60 - $Old_DATA` echo "DATA60 $DATA60" echo "Old_DATA60 $Old_DATA" echo "jikan $jikan" echo " " DATA60=`date +%-H%M%S` Name=(red yellow blue) for i in ${Name[@]} do eval "${i}_DATA"=`date +%-H%M%S` eval "echo ${i}_DATA \$${i}_DATA" eval 'jikan=`expr \$${i}_DATA - $DATA60`' echo $jikan sleep 2 done 上記を実行すると、 $ . test-expr.sh DATA60 170553 Old_DATA60 170553 jikan 0 red_DATA 170553 expr: 整数でない引数 yellow_DATA 170555 expr: 整数でない引数 blue_DATA 170557 expr: 整数でない引数 と、エラーになってしまいます。 経過時間をそれぞれ知りたいのですが、exprで四則演算をする際に変数を動的にした場合、どのように記述すれば良いか、お教えねがえませんでしょうか

  • taku0
  • お礼率80% (160/199)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4834/10234)
回答No.2

>どうしてシングルクォーテーションで囲まなければいけないのかの理由がよくわからないのですが、 囲んだわけじゃなくて、外に出したわけですね。シングルクォートの中では変数展開されないので。 eval 'jikan=`expr \$'${i}'_DATA - $DATA60`' jikan=`expr \$' までは1つのシングルクォートの中で、'_DATA - $DATA60`' が2つめのシングルクォートの中。${i} はシングルクォートの外。 そもそも、bashなら配列を使えば良いのでは?Nameのところで使ってるわけだし。 DATA60=`date +%-H%M%S` Name=(red yellow blue) for i in ${Name[@]} do DATA[$i]=`date +%-H%M%S` echo DATA[$i] ${DATA[$i]} jikan=`expr ${DATA[$i]} - $DATA60` echo $jikan sleep 2 done 時分秒表現を引き算しても意味のある数字になりませんが、いいのでしょうか? date +%s がいいのでは?

taku0
質問者

お礼

アドバイスいただきありがとうございます。 ・シングルクォートの件 基本的な事だと思うんですが、分からない自分にとっては目から鱗です。 「外に出す」というので、なるほど~!と納得です。 シングルクォートの範囲が外側同士じゃなくて、中に入れたシングルクォートに境界が移り、間にあるバッククォートは単なる文字列でしかなくなるという解釈なんですね。そして外に出た変数が展開される・・・と。 納得です~。 後、ご指摘の配列を使えば良いのでは? という事ですが、まさしくおっしゃるとおりです^^; 何年プログラムやってるんだ~って感じですねw 発想力が乏しいというか、応用が効かないというか・・まだまだだな~と実感させられてしまいます。う~ん恥ずかしい限りですw 更に、data +%sのご指摘も 単に経過秒数だけをカウントするという事じゃ駄目な事に気が付きました。 dataコマンドのオプション調べてたんですけど、視点が1日単位。という発想が何とも間抜けですね。 sleepを24時間2秒後でテストしたとしても、カウントは2ですもんね。 色々鋭いご指摘を頂き、また一つ大きくなれた気がします 感謝です ありがとうございました!

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

一応、解決はしたみたいですが > 何度も見なおして というところが気になったので。 bash の -x オプションはご存知でしょうか? もしご存知なければ、マニュアルで調べてください。 デバグがかなり楽になります。

taku0
質問者

お礼

バッシュのデバッグ どうやるんだろう・・と思いつつ検索せずじまいでした。 なるほどですね~。 通常のエラー箇所で止まるのと違い、実行処理が1行ずつ表示されてとても良いですね^^ 感謝です ありがとうございます!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

eval してるところ, どんな文字列を eval してるのか はちゃんと確認できてる?

taku0
質問者

お礼

ご助言ありがとうございます。 何度も見なおしてeval箇所を下記の形で実現できました。 eval 'jikan=`expr \$'${i}'_DATA - $DATA60`' バッククォート内でシングルクォーテーションで\$'${i}'_DATA のようにする事で展開できました! ですが、どうしてこれで展開できるのかの理由が良くわからないです。 一番外側をシングルクォーテーションで囲い、バッククオートでexprコマンドを実行する際、その中にあるシングルクォートで囲った${i}が展開されるてうまくいきましたが、ここをダブルクォテーションで囲むと、「expr: 整数でない引数」のエラーになってしまいます。 どうしてシングルクォーテーションで囲まなければいけないのかの理由がよくわからないのですが、もしお分かりになるようでしたら、お教え願いませんでしょうか

関連するQ&A

  • シェルスクリプト内での四則演算

    非常に基本的な事だと思うのですが、どうしても解決できないので質問させてください。 シェルスクリプトで四則演算をしたいです。expr を使って下記の通りに書きました。 ---------------- #!/bin/sh echo $1 echo $2 AA='expr $1 + $2' echo "$AA" ---------------- これを test.sh として保存し、 $ sh test.sh 1 2 と試してみると、出力が ---------------- 1 2 expr $1 + $2 ---------------- となります。最後の行は 3 になってもらいたいのですが。 ちなみに、普通にコマンドプロンプトで $ expr 1 + 2 とやれば 3 と出てきます。 環境は Ubuntu 9.04 よろしくお願いします。

  • 演算子の優先順位

    インクリメントと四則演算の優先順位に関して迷っています。 手持ちの教材では、++,--は四則演算+,-,*,/よりも上位なはずなのですが、どうやら後から計算されているようなのです。 【具体例】 g=10, h=5としたときに i = ++g / h-- とすると、i = 2となるのが、わかりません。 なぜでしょうか?

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか

    awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか。 ファイル(hoge.txt)の内容は、次の通り(全4行) 123 456 50 20 これを、bashスクリプトで計算させます。 FF=`cat hoge.txt | awk 'BEGIN {x=$2;printf ("%s, %s", (148+x*0.05), x);}'` echo "答え = ${FF}" このときの$2の値は、50です。但し、文字列として扱われているようです。 xの値を、数値として代入され、四則演算をさせるにはどうしたら良いですか? 以上、よろしくお願いします。

  • 配列128桁の加算、減算について。

    現在C言語で四則演算について勉強しています。 128桁の配列をもつ整数についてa,b,各桁を加算、減算するプログラムを書きたいのですが分からなくて困ってます。できればCのソースを教えて欲しいですおねがいします。  s = 65536 a[128],b[128],c[128]   i = -1 とする。  i <128 である限り、演算を実行。 i >127なら終わり。(++1) c(i) = a(i) - b(i)という演算を行う。 c(i) < 0 の場合 s を借りてくる。 c(i)に s を加算し、上の桁から1を引く。  

  • evalが使えない場合

    以下のスクリプトでLINUX環境でevalが使用できない場合、 input_logを環境変数から取得したいのですが、 何か方法がありますでしょうか?教えてください。 while [ $i -lt 3 ] do i=`expr $i + 1` #入力ファイル名の設定 input_log=log_$i input_log=`eval echo $"$input_log"` done

  • 4の倍数を論理演算で表す。。

    /*Prog32.cキーボードから整数型変数aへデータを入力し、aの値が4の倍数のときは“4の倍数です”と表示し、そうでないときは、“4の倍数ではありません”と表示する。ただし、整数データのビット数はわからないものとし、計算にはビットごとの論理演算のみを用いる。*/ #include <stdio.h> int main(void) { int a; printf("整数を入力して下さい! "); scanf("%d", &a); (a % 4 ) ? printf("4の倍数ではありません。\n", a) :printf("4の倍数です。\n", a); return(0); } 4の倍数を論理演算で表す方法がわかりません。。 自分では上記のように算術を使うやりかたしかわかりませんでした。 よろしくお願いします!

  • 電卓プログラムを作りたい。

    わたしは、プログラムの初心者なのですが、力不足でプログラムが作れないのでご協力おねがいします。 データをすべて整数で演算子は、1個だけ用い、標準入力を受け取り、リターンキーが押されると、その解答を標準出力に表示するような、加減乗除の四則演算と整数剰余の演算を繰り返し行うことが可能な電卓プログラムを作りたいのですが、、、。

  • shell 変数について

    お世話になっております。 たびたびすみません。 shellプログラミングで質問です。 以下のようなプログラムを作成したところ、 引数に2147483648以上の数値を与えて実行すると 変数に代入される値が-マイナスとなり、 おかしくなってしまいます。 シェル変数の上限は2147483647なのでしょうか? だとしたら、これ以上の数値を代入することはできないのでしょうか。 お手数ですが、よろしくお願いいたします。 #!bin/sh firstno=$1 echo "do you make a file?(y/n)" read ans if [ $ans = "y" ]; then sed -e 's/AAA/aaa/' aaa.csv >> aaaaaa.csv firstno=`expr $firstno + 1` echo "next no is \"$firstno\"" fi

  • XAMPを使っているのですが、論理演算子がうまく機能しません。

    XAMPを使って、PHPプログラムの練習をしています。 論理演算子を試しているですが、本に書いてあるような結果に なりません。phpバージョンはPHP 5.3.0です。 $f = true; $g = false; $h = $f and $g; $i = $g and $f; echo "result:".$h; $hも$gも同じように結果は空白になるはずなのですが、$hのほうは 1が返ってきます。なにが原因なのでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう