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 回答