質問

私はbashスクリプトに問題があります。私はmultiplicateする演算子*を使用する必要があります。代わりに、スクリプトのバグ私を拡張して、オペレータとしてのスクリプト自体の名前を使用。私は単一引用符でみましたが、それは動作しません:(ここでは、コードです。

#!/bin/bash -x

# Bash script that calculates an arithmetic expression
# NO PRECEDENCE FOR OPERATORS
# Operators: + - * 

if [ "$#" -lt "3" ]
then 
    echo "Usage: ./calcola.scr <num> <op> <num> ..."
    exit 1
fi

result=0
op=+
j=0

for i in "$@"
do
    if [ "$j" -eq "0" ]
    then
        # first try
        #result=$(( $result $op $i )) 

        # second try
        let "result$op=$i"

        j=1
    else
        op=$i
        j=0
    fi
done

echo "Result is $result"

exit 0
役に立ちましたか?

解決

「OP」は「*」である場合は、あなたのスクリプトもそれを見ている前に、

、それはシェルによって展開されます。あなたは、「X」のように、あなたの乗算演算子のために何か他のものを選択するか、または一重引用符でそれを置くか、バックスラッシュでそれに先行することによってそれを逃れるためにあなたのユーザーを強制する必要があります。

運動の用語は、それを許可する

場合は、多分あなたは、コマンドラインからそれらを取得するのではなく、標準入力からの発現を取得するには、「読み」を使用してみてください。

他のヒント

あなたが必要としない場合は、「*拡張」だけ「-f」でそれを開始し、まったくスクリプトのために(一般的には「グロブ」と呼ばれます)。あなたはまた、実行時に変更することができます:

mat@owiowi:/tmp/test$ echo *
A B
mat@owiowi:/tmp/test$ set -f
mat@owiowi:/tmp/test$ echo *
*
mat@owiowi:/tmp/test$ set +f
mat@owiowi:/tmp/test$ echo *
A B

それはあなただけで正しく*をエスケープしていない、動作します。バックスラッシュを使用してみてください。

$ ./calcola.scr 2 \* 3
+ '[' 3 -lt 3 ']'
+ result=0
+ op=+
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let result+=2
+ j=1
+ for i in '"$@"'
+ '[' 1 -eq 0 ']'
+ op='*'
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let 'result*=3'
+ j=1
+ echo 'Result is 6'
Result is 6
+ exit 0
$

ポールTomblinのがに述べたように、けれども、おそらく代わりに、乗算演算子としてxを使用する方が良いでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top