0

BASHで簡単な電卓を書いて​​います。その目的は、与えられた引数をループし、それらが正しいかどうかを確認し、累乗関数を実行し、残りを expr に渡して計算を行うことです。乗算以外はすべて機能します。
私が何かをするとき

my_script.sh 2 \* 2  

expr から構文エラーが発生します。bash -x で確認すると、

expr 2 '\*' 2  

* はアポストロフィです。expr が適切に解析できるように、それを取り除く方法がわかりません。

if [ $# -le 0 ]
then
    usage
    exit 1
fi

ARGS=("${@}")

while [ $# -gt 0 ]
do
    if [ $OP -eq 0 ]
    then
        if [[ $1 =~ ^[-]{0,1}[0-9]+$ ]]
        then
            ELEMS[$J]=$1
            shift
            let OP=1
            let J=$J+1
        else
            echo $1' is not a number'
            usage
            exit 3
        fi
    else
        if [[ $1 =~ ^[-+/\^\*]{1}$ ]]
        then
            if [[ $1 =~ ^[\^]{1}$ ]]
            then
                if ! [[ $2 =~ ^[0-9]+$ ]]
                then
                    echo 'Bad power exponent'
                    usage
                    exit 3
                fi
                let BASE=${ELEMS[$J-1]}
                let EX=$2
                pow $BASE $EX
                let ELEMS[$J-1]=$RES
                shift 2
            else
                if [[ $1 =~ [\*]{1} ]]
                then
                    ELEMS[$J]=\\*
                else
                ELEMS[$J]=$1
                fi
                let J=$J+1
                shift
                let OP=0
            fi
        else
            echo $1' is not an operator'
            if [[ $1 =~ ^[0-9]+$ ]]
            then
                let TMP=${ELEMS[$J-1]}
                echo "Are you missing an operator beetwen $TMP and $1?"
            fi
            usage
            exit 3
        fi
    fi    
done

if [ $OP -eq 0 ]
then
    echo 'Missing argument after last operator'
    usage
    exit 3
fi
echo "Calculation: ${ARGS[*]}"
echo -n 'Result: '
expr ${ELEMS[*]}
4

1 に答える 1

2

(または) に変更ELEMS[$J]=\\*して使用します。ELEMS[$J]="*"ELEMS[$J]=\*

expr "${ELEMS[@]}"

重要なのは、配列逆参照の@代わりに使用することです。これにより、二重引用符を使用できます。*これは と同等でexpr "2" "*" "2"、代わりexpr "2 * 2"に使用時に得られますexpr "${ELEMS[*]}"

于 2012-11-24T19:22:09.347 に答える