• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:exprで四則演算をする際に変数を動的にしたい)

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答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

専門家に質問してみよう