Bash传递数组到expr

时间:2012-11-24 19:09:51

标签: arrays bash

我正在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[*]}

1 个答案:

答案 0 :(得分:2)

ELEMS[$J]=\\*更改为ELEMS[$J]="*"(或ELEMS[$J]=\*)并使用:

expr "${ELEMS[@]}"

关键是在数组解除引用中使用@而不是*,这允许您使用双引号。这相当于expr "2" "*" "2",而不是使用expr "2 * 2"时获得的expr "${ELEMS[*]}"