web-dev-qa-db-ja.com

ShellUnixでの計算

(シェルスクリプトで)簡単な計算を行うために、UNIXの2回の違いを計算しようとしていますが、うまくいかないようです。

1つは$d、もう1つは$cという2つの変数を設定しました。

変数を設定するために現在使用している構文は次のとおりです。

c= echo $a | awk -F : '{print ($1 * 32140800) + ($2 * 2678400) + ($3 * 86400) + ($4 * 3600) + ($5 * 60) }'
echo $c
d= echo $a | awk -F : '{print ($1 * 32140800) + ($2 * 2678400) + ($3 * 86400) + ($4 * 3600) + ($5 * 60) }'
echo $d

(変数aとbは、単に別のスクリプトからタイムスタンプを受け取ります)

$cから$dの出力を減算しようとしていますが、使用したすべての方法が機能しないようです。

私は以下を試しました:1)

duration=$(echo "$d - $c")
echo $duration 

2)

duration=$((d-c))
echo $duration 
2
SSR
_c= echo $a | awk -F : '{print ($1 * 32140800) + ($2 * 2678400) + ($3 * 86400) + ($4 * 3600) + ($5 * 60) }'
_

ここにコマンド置換がありません。これは、cの環境でechoを空の値に設定しながら、_echo | awk_パイプラインを実行するだけです。

以下のduration=$(echo "$d - $c")でコマンド置換を使用しましたが、これもここで必要です。つまり.

_c=$(echo "$a" | awk  ...)
_

(_=_記号の前後に空白がないことに注意してください。これにより、プレーン割り当てとコマンドが区別されます。 シェルスクリプトの変数割り当てのスペース を参照してください。

また、awkスクリプトの数値を見ると、31日の月、したがって372日の年があるように見えますが、これは希望する場合とそうでない場合があります。入力に秒もある場合、awkスクリプトはそれらを使用しません。 (最後に_+ $6_があるべきですか?)両方のコマンドには、_$a_と_$a_の代わりに_$b_もあります。

_duration=$(echo "$d - $c")
_

durationは指定されたものを出力するだけで、算術演算は行わないため、これはdを_5678 - 1234_(実際の値はcおよびecho)のような文字列に設定するだけです。

_duration=$((d-c))
_

これは減算を行うために機能するはずです。

5
ilkkachu

どのシェルを使用していますか?算術演算は古い学校では実装されていません/bin/shしかし、bashではかなりうまく機能します:

~$ a=10000000
~$ b=200
~$ echo $((a-b))
9999800
2
binarym