2012-11-24 73 views
0

我在BASH中編寫了一個簡單的計算器。它的目的是循環所給出的參數,檢查它們是否正確,執行冪函數並將其餘部分傳遞給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[*]} 
+0

變化'elems的[$ J] = \\ *''到elems的[$ J] = 「*」' –

+0

當我改變'elems的[$時得到J] = \\ *'到'ELEMS [$ J] =「*」'代替乘法運算符我得到腳本所在目錄中所有文件的列表。所以它就像'expr 2 in out project.sh 2 ' – xartii

回答

2

變化ELEMS[$J]=\\*ELEMS[$J]="*"(或ELEMS[$J]=\*)及用途:

expr "${ELEMS[@]}" 

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

+0

謝謝,這個解決方案運行良好,我被關閉了。我試着使用@但沒有「」在數組周圍。 – xartii