4

bash スクリプトに問題があります。乗算するには演算子 * を使用する必要があります。代わりに、スクリプトは展開し、スクリプト自体の名前を演算子として使用することで私を悩ませます。一重引用符で試しましたが、機能しません:(コードは次のとおりです

#!/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
4

3 に答える 3

8

スクリプトに「* 展開」(一般に「グロビング」と呼ばれる) がまったく必要ない場合は、「-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
于 2008-12-22T18:39:24.773 に答える
6

「op」が「*」の場合、スクリプトがそれを見る前に、シェルによって展開されます。乗算演算子に「x」などの別のものを選択するか、単一引用符で囲むかバックスラッシュを前に付けて、ユーザーに強制的にエスケープさせる必要があります。

演習の条件が許せば、コマンドラインから式を取得するのではなく、「読み取り」を使用して標準入力から式を取得してみてください。

于 2008-12-16T21:35:45.143 に答える
2

それはうまくいきます、あなたは*正しくエスケープしていません。バックスラッシュを使用してみてください:

$ ./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
$

ただし、Paul Tomblinが言及xしたように、代わりに乗算演算子として使用する方がおそらく良いでしょう。

于 2008-12-16T21:43:59.290 に答える