Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Bash将数组传递给expr_Arrays_Bash - Fatal编程技术网

Arrays Bash将数组传递给expr

Arrays Bash将数组传递给expr,arrays,bash,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=("$

我正在用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“2”*“2”
,而不是
expr“2*2”
,当我将
ELEMS[$J]=\\\*
更改为
ELEMS[$J]=\\\*
时,使用
expr“${ELEMS[$J]=\\\\*
ELEMS[$J]=”更改为
ELEMS[$J]=“*”
我从脚本所在的目录中获取所有文件的列表,以代替乘法运算符。所以这就像是expr 2 in out project.sh 2
谢谢,这个解决方案很好,我被关闭了。我尝试在数组中使用@,但没有使用“”。
expr "${ELEMS[@]}"