web-dev-qa-db-ja.com

シェルスクリプトでのexprとの乗算

加算、減算、乗算、除算を行う基本的な計算機を作成しています。

加算は機能しますが、乗算は機能しません。乗算しようとすると、「プログラムを正しく実行できませんでした」という応答が返されます。

$ ./calculator 4 + 5
9
$ ./calculator 4 * 5
You did not run the program correctly
Example: calculator 4 + 5

Googleで検索したところ、\\*コード、それでも動作しません。誰かが私に解決策や説明を提供できますか?

ここに私のコードがあります

#!/bin/bash

if [ $# != 3 ]; then  
  echo You did not run the program correctly   
  echo Example: calculator 4 + 5                
  exit 1 
fi

if [ $2 = "+" ]; then    
  ANSWER=`expr $1 + $3`    
 echo $ANSWER 
fi

if [ $2 = "*" ]; then
  ANSWER=`expr $1 \\* $3`  
  echo $ANSWER 
fi

exit 0
8
Alex Wolfe

コードには多くの問題があります。ここに修正があります。 *は、「現在のディレクトリ内のすべてのファイル」を意味します。代わりに、リテラルアスタリスク/乗算文字を意味するには、エスケープする必要があります。

./calculator 3 \* 2

または

./calculator 3 "*" 2

また、二重引用符で囲む必要があります"$2"、 さもないと *は再び「すべてのファイル」の意味を開始します:

#!/bin/bash
#Calculator
#if [ `id -u` != 0 ]; then
#  echo "Only root may run this program." ; exit 1
#fi
if [ $# != 3 ]; then   
  echo "You did not run the program correctly"
  echo "Example:  calculator 4 + 5"
  exit 1
fi
# Now do the math (note quotes)
if [ "$2" = "+" ]; then echo `expr $1 + $3`
Elif [ "$2" = "-" ]; then echo `expr $1 - $3`
Elif [ "$2" = "*" ]; then echo `expr $1 \* $3`
Elif [ "$2" = "/" ]; then echo `expr $1 / $3`
fi
exit 0
16
hongo

*はシェル構文の特殊文字であるため、エスケープする必要があります。 (エスケープされていない場合、現在のディレクトリ内のすべてのファイルのリストに展開されます)。ただし、エスケープするには単一のバックスラッシュのみを使用する必要があります。

ANSWER=`expr $1 \* $3` 
6
hek2mgl