を使用して2つの数値を追加する現在行っている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の両方でこれを実行しようとしましたが、同じエラーが発生します。「ここに欠けているもの」を教えてもらえますか?
コメント
- 関連: unix.stackexchange.com/questions/40786/ …
回答
まず、割り当て用のスペースを削除する必要があります。例:
sum="expr $num1 + $num2"
次に、"
を`
に変更するか、さらに適切に:
sum=$(expr "$num1" + "$num2")
expr
を使用する代わりに、計算を行うこともできますシェルで直接計算:
sum=$((num1 + num2))
コメント
- iv id =を使用する動機がある場合
$((...))
の代わりに “d077711eec”>
は、クラシックなBourneシェルに移植できるようにすることを望んでいるため、'をお勧めします。 $(...)
も回避するため。
$()
をサポートしていないシェルはありますか?私の知る限り、それはposixで必要とされています。すべてのposix互換シェルは$()
$(…)
ですが、ほぼ消滅しています(Solarisで/bin/sh
を実行している人がいるかもしれません)。$(…)
-または少なくとも、すべてのバージョンではありません。回答
おそらく、行の単一引用符としてバックティックを読み間違えています:
sum = "expr $num1 + $num2"
代わりに$(...)
を使用する方法については、グレッグのWiki を参照してください。
これ期待どおりに機能します:
sum=$(expr "$num1" + "$num2")
また、等号(変数の割り当て)の周囲にギャップがないことに注意してください。
回答
expr
は、 Bourne shell (つまり、 sh)。 Bourneシェルには、元々単純な算術演算を実行するメカニズムがありませんでした。バッククォートを使用してexpr
外部プログラムを使用します。
バッククォート( `)は、実際にはコマンド置換と呼ばれます。コマンド置換は、シェルが特定のコマンドセットを実行し、その出力を置換するメカニズムです。コマンドの場所。
sum=`expr $num1 + $num2`
bash (bourne again shell)次のsystaxがあり、外部プログラムexpr
を使用しません。
sum=$((num1+num2))
外部プログラムexpr
を使用する場合。次のsystaxがあります:
sum=$(expr $num1 + $num2)