Bash 将数组传递给 expr



我正在用BARH编写一个简单的计算器。其目的是循环访问给定的参数,检查它们是否正确,执行幂函数并将其余部分传递给 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[*]}

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

expr "${ELEMS[@]}"

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

相关内容

  • 没有找到相关文章

最新更新