Linuxシェルで変数を使用して除算するにはどうすればよいですか?


136

次のようにシェルでコマンドを実行すると、expr: non-integer argumentエラーが返されます。誰かがこれを私に説明してくれませんか?

$ x=20
$ y=5
$ expr x / y 
expr: non-integer argument

4
@ShivanRaptor質問はRTFMの質問であると主張するかもしれませんが、それは確かに有効なシェルプログラミングの質問です。これは、逆参照を必要としない言語(RubyやJavaScriptなど)から来た人にとっても妥当な質問です。開いたままにしておく必要があります。
トッドA.ジェイコブス

6
@ShivanRaptorいいえ、これはここのトピックです。Bashでのプログラミングについてです。Unix / Linuxは、プログラミングではなく、主にシステムを使用するためのものです。現在、シェルスクリプトはプログラミングとシステムの使用の境界をまたいでいるため、どちらのサイトでも話題になる可能性があります。「ネットワーキングの設定方法」について質問がある場合、それは間違いなくUnix / Linuxに属しています。Bashのインタラクティブなキーバインドについての質問であれば、それもそこに含まれます。しかし、シェルスクリプティングに関する質問は、間違いなくここにもあります。
ブライアンキャンベル

(... floatに変換int型への)シェルからのPythonへの呼び出しを使用して、$ BASH変数の減算と除算を示し、ここで私の答えを参照してください:stackoverflow.com/questions/8385627/...
ビクトリアスチュアート

回答:


195

これらの変数はシェル変数です。それらをパラメーターとして別のプログラム(つまり expr)に展開するには、$プレフィックスを使用する必要があります。

expr $x / $y

それが不平を言った理由はそれがあなたがアルファベット文字(すなわち非整数)を操作しようとしていたと思ったからです

Bashシェルを使用している場合は、式の構文を使用して同じ結果を得ることができます。

echo $((x / y))

または:

z=$((x / y))
echo $z

1
bashのマンページを読むと、多くのことがわかります。入力man bash(プロンプトでq出口まで)
水田

62
このページのどこかに、ほとんど(すべてではないにしても)のGNU / Linuxシェルは整数演算のみを実行することに注意してください。
Skippy le Grand Gourou 2014

35

私はすでに他のスレッドで言及されていたと思います:

calc(){ awk "BEGIN { print "$*" }"; }

それからあなたは単にタイプすることができます:

calc 7.5/3.2
  2.34375

あなたの場合それは次のようになります:

x=20; y=3;
calc $x/$y

または、必要に応じて、これを別個のスクリプトとして追加し、$ PATHで使用できるようにして、常にローカルシェルで使用できるようにします。

#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }

4
使用することもできますecho '1 / 3' | bc -l
Eugene

19

letを使用しないのはなぜですか。私はそれがはるかに簡単だと思います。ここにあなたが役に立つかもしれない例があります:

start=`date +%s`
# ... do something that takes a while ...
sleep 71

end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds

別の簡単な例-1970年からの日数を計算します。

let days=$(date +%s)/86400

15

Bash変数を参照するにはパラメーターの展開が必要

ほとんどのLinuxディストリビューションのデフォルトのシェルはBashです。Bashでは、変数はパラメーター展開にドル記号の接頭辞を使用する必要があります。例えば:

x=20
y=5
expr $x / $y

もちろん、Bashには算術演算子と特別な算術展開構文もあります。そのため、別個のプロセスとしてexprバイナリを呼び出す必要はありません。シェルに次のようにすべての作業を行わせることができます。

x=20; y=5
echo $((x / y))

詳細は、Bashリファレンスマニュアルの算術拡張シェル算術を参照してください。
トッドA.ジェイコブス

1
これは逆参照とは関係ありませんが、補間でありexpr、2013年には推奨されません
。– Gilles Quenot

@sputnick明らかに混乱しています。辞書を気軽にご相談ください。デリファレンス補間参照してください。
トッドA.ジェイコブス

1
より良い言葉は拡大していますが、逆参照ではありません。逆参照は、ポインターを使用する場合に使用されます。ここではそうではありません。これは単純な変数です。
Gilles Quenot 2013

1
@Prashant:tldpは、bashの世界で適切なリファレンスであることがわかっていません。
Gilles Quenot 2013

1

としましょう

x=50
y=5

その後

z=$((x/y))

これは正しく動作します。しかし、caseステートメントで/演算子を使用したい場合は、解決できません。 ここにコードを入力してください その場合は、divやdevideなどの単純な文字列を使用します。コードを見る


これは間違っています。/シェルケースのラベルとしてうまく機能します。うまくいかないのは*、それを引用せずに乗算に使用することです。それは、それが効果的にあなたの例では「devide」と「モジュロ」である場合、には、以下のすべての項目を上書きする原因となる
dave_thompson_085

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.