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で四則演算をする際に変数を動的にした場合、どのように記述すれば良いか、お教えねがえませんでしょうか
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 がいいのでは?
アドバイスいただきありがとうございます。
・シングルクォートの件
基本的な事だと思うんですが、分からない自分にとっては目から鱗です。
「外に出す」というので、なるほど~!と納得です。
シングルクォートの範囲が外側同士じゃなくて、中に入れたシングルクォートに境界が移り、間にあるバッククォートは単なる文字列でしかなくなるという解釈なんですね。そして外に出た変数が展開される・・・と。
納得です~。
後、ご指摘の配列を使えば良いのでは?
という事ですが、まさしくおっしゃるとおりです^^;
何年プログラムやってるんだ~って感じですねw
発想力が乏しいというか、応用が効かないというか・・まだまだだな~と実感させられてしまいます。う~ん恥ずかしい限りですw
更に、data +%sのご指摘も 単に経過秒数だけをカウントするという事じゃ駄目な事に気が付きました。
dataコマンドのオプション調べてたんですけど、視点が1日単位。という発想が何とも間抜けですね。
sleepを24時間2秒後でテストしたとしても、カウントは2ですもんね。
色々鋭いご指摘を頂き、また一つ大きくなれた気がします 感謝です ありがとうございました!
No.3
- 回答日時:
一応、解決はしたみたいですが
> 何度も見なおして
というところが気になったので。
bash の -x オプションはご存知でしょうか?
もしご存知なければ、マニュアルで調べてください。
デバグがかなり楽になります。
バッシュのデバッグ どうやるんだろう・・と思いつつ検索せずじまいでした。
なるほどですね~。
通常のエラー箇所で止まるのと違い、実行処理が1行ずつ表示されてとても良いですね^^
感謝です ありがとうございます!
No.1
- 回答日時:
eval してるところ,
どんな文字列を eval してるのか
はちゃんと確認できてる?
ご助言ありがとうございます。
何度も見なおしてeval箇所を下記の形で実現できました。
eval 'jikan=`expr \$'${i}'_DATA - $DATA60`'
バッククォート内でシングルクォーテーションで\$'${i}'_DATA のようにする事で展開できました!
ですが、どうしてこれで展開できるのかの理由が良くわからないです。
一番外側をシングルクォーテーションで囲い、バッククオートでexprコマンドを実行する際、その中にあるシングルクォートで囲った${i}が展開されるてうまくいきましたが、ここをダブルクォテーションで囲むと、「expr: 整数でない引数」のエラーになってしまいます。
どうしてシングルクォーテーションで囲まなければいけないのかの理由がよくわからないのですが、もしお分かりになるようでしたら、お教え願いませんでしょうか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Excel(エクセル) 何方か知恵をください… 下記のシート1にシート2のDATAを表示させたいです。 (シート1の2行目の 6 2022/03/28 17:27
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- 英語 data について 6 2023/03/25 11:05
- C言語・C++・C# プログラミングの問題です。写真のプログラムの1から10を下のように入力しましたがプログラムが上手くい 3 2022/07/01 23:31
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) np.stack()とnp.array()の違い 4 2022/05/01 00:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batである文字列内に特定の文字...
-
スクリプト中のexportコマンド...
-
【sh】tee コマンドの代替方法
-
シェルスクリプトの変数の制限?
-
【シェルスクリプト】 ローカル...
-
bashスクリプト
-
kshでのNULLの比較
-
SONYの音楽ソフト「x-アプリ」...
-
Dirコマンドでフォルダ内ファイ...
-
TOPコマンドで表示するCPU使用...
-
スクリプトのエラー「unexpecte...
-
[バッチファイル]レジストリ値...
-
ファイル名についている「-」と...
-
UNIX コマンドにおける # や円...
-
net use /d の強制実行
-
プロセス、サービス、デーモン...
-
エクセルの表にヘンな枠が・・・
-
シェルスクリプトでエラーが出ます
-
bashでシングルクォート内の変...
-
シェルスクリプト実行で”そのよ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batである文字列内に特定の文字...
-
スクリプト中のexportコマンド...
-
shellスクリプトから別のshell...
-
bashスクリプト
-
シェルスクリプトの変数の制限?
-
kshでのNULLの比較
-
【sh】tee コマンドの代替方法
-
ファイルから文字列を読み込む...
-
シェルで and/or の優先順位に...
-
if文について
-
Bシェル 文字列に含まれる特...
-
Cシェルで標準エラー出力への...
-
cshの条件式について教えてくだ...
-
【シェルスクリプト】whileルー...
-
Cシェルプログラムで、あるディ...
-
ログインシェル時のSHELL環境変数
-
rubyで、バッククォートの中に...
-
【シェルスクリプト】 ローカル...
-
sh スクリプト ipアドレス形式...
-
シェルスクリプトでうるう年判定
おすすめ情報