exprを使用して2つの数値を追加する


13

現在行っているITの卒業証書のシェルスクリプトを学んでいます。与えられたチュートリアルの1つに示されているように、2つの数字を追加する小さなスクリプトを作成しようとしています。

echo "Enter two numbers"
read num1 num2
sum = 'expr $num1 + $num2'
echo "The sum is = $sum"

ただし、実行許可を与えてスクリプトを実行すると、このエラーが発生します。

sum: =. No such file or directory.
sum: expr $num1 + $num2: No such file or directory

ここに画像の説明を入力してください

UbuntuとFedoraの両方でこれを実行しようとしましたが、同じエラーが発生します。誰も私がここで何が欠けているのか教えてもらえますか?


回答:


39

まず、割り当てのためのスペースを取り除く必要があります。例えば

sum='expr $num1 + $num2'

次に'`またはそれ以上に変更する必要があります$()

sum=$(expr "$num1" + "$num2")

使用exprする代わりに、シェルで直接計算することもできます:

sum=$((num1 + num2))

3
expr代わりに使用する動機$((...))が、古典的なBourneシェルに移植したいという願望である場合は、$(...)同様に避けることをお勧めします。
アランカレー

2
@AlanCurryサポートしていないシェルはあります$()か?私が知る限り、それはposixに必要です。たとえば、すべてのposix互換シェルはサポートする必要があります$()
Ulrich Dangel

1
@UlrichDangelオリジナルのBourneシェルは持っていませんでしたが$(…)、消滅しました(誰かが/bin/shSolarisでまだ実行されている可能性があります)。
ジル 'SO-悪であるのをやめる

Cシェルは$(…)、すべてのバージョンではなく、少なくともサポートしていません。
スコット

変数を二重引用符で囲む目的は何ですか?
kojow7

9

おそらく、バッククォートを一重引用符として誤読している可能性があります。

sum = 'expr $num1 + $num2'

代わりに使用するGregのWikiを参照してください$(...)

これは期待どおりに機能します。

sum=$(expr "$num1" + "$num2")

また、等号(変数の割り当て)の周りにギャップがないことに注意してください。


1

exprBourneシェル(つまりsh)によって使用される外部プログラムです。Bourneシェルには、もともと単純な算術を実行するメカニズムがありませんでした。exprバックティックの助けを借りて外部プログラムを使用します。

backtick(`)は実際にはコマンド置換と呼ばれます。コマンド置換は、シェルがコマンドの特定のセットを実行し、コマンドの代わりにそれらの出力を置換するメカニズムです。

sum=`expr $num1 + $num2`

bash(Bourneシェルは再びシェル)それはextrnalプログラムを使用することはありません、以下systaxを持っていますexpr

sum=$((num1+num2))

外部プログラムを使用する場合expr。次のsystaxがあります。

sum=$(expr $num1 + $num2)


-1
#!/bin/bash
function add()
{
sum=`expr $a + $b`
echo "Sum is :$sum";
}

echo "Enter the value of a";
read a
echo "Enter the valure of b";
read b
add

また、コードに関する説明を追加し、質問の解決にどのように役立ちますか?
テハ14年


-2

単一のバックティック(`キー)を使用できます


1
バックティックであり、$( ... )代わりにシェルで使用することをお勧めします。また、問題は、OPが使用すべきでないスペースを使用することです。
フォンブランド


-3
echo "addition of two number"

echo "enter a number"
read a
echo "enter a number"
read b

c=`expr $a + $b`

echo $c

3
これは質問に答えていません。何らかの説明が役立ちます。
ベルンハルト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.