簡體   English   中英

Bash傳遞數組到expr

[英]Bash passing array to expr

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

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

expr "${ELEMS[@]}"

關鍵是在數組解除引用中使用@而不是* ,這允許您使用雙引號。 這相當於expr "2" "*" "2" ,而不是使用expr "${ELEMS[*]}"時得到的expr "2 * 2" expr "${ELEMS[*]}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM