2014-01-22 47 views
0

我試圖檢查一個數字是否是迴文。我使用了一個名爲pal()的函數。我得到這個錯誤,說:得到此錯誤「預計整數表達式:行10和23」在這個bash外殼

./pal.sh: line 10: [: input: integer expression expected 
./pal.sh: line 23: [: input: integer expression expected 

我的代碼:

#!/bin/bash 

pal() 
{ 
    num=$1 
    rnum=$num 
    add=0 
    k=0 

    while [ $num -ne 0 ] 
    do 
    lev=1 
    mod= $num % 10 
    for((i=0;i<$k;i++)) 
    do 
     lev=`expr $lev \* 10` 
    done 
    mul=`expr $mod \* $lev` 
    add=`expr $add + $mul` 
    num=`expr $num/10` 
    k=`expr $k + 1` 
    done 
    if [ $rnum -eq $add ] 
    then 
    echo "pallindrome" 
    else 
    echo "not pallindrome" 
    fi 

} 
echo "input number" 
read input 
pal input 
+0

歡迎堆棧溢出。請儘快閱讀[關於]頁面。你在程序中輸入什麼值?當你用'bash -x yourscript'運行它時,你會得到什麼?如果函數的內部沒有顯示,請在函數的開頭添加'set -x'來啓用跟蹤。這是基本的shell腳本調試技術;它將在未來幫助你。 –

+2

'mod = $ num%10' =>'mod = $((num%10))' – anubhava

回答

2

你需要傳遞變量的值,而不是它的名字:

pal $input 

而且, anubhavacomment中指出,您需要修正函數中的算術運算:

mod= $num % 10 

應該是:

mod=$(($num % 10)) 

或:

((mod = $num % 10)) 

你也應儘量避免使用exprbash - 有內置的設施,以應付相當多的東西expr可以處理。

+0

非常感謝。這真的很有用。請給我建議任何好網站,我可以找到大部分「在設施?「 – furiousNoob

2

您可以用rev從 「UTIL-LINUX」 像這樣做,

#!/bin/bash 
pal() 
{ 
    input=$1 
    if [ $input == $(echo $input | rev) ]; then 
    echo "pallindrome" 
    else 
    echo "not pallindrome" 
    fi 
} 
echo "input number" 
read input 
pal $input 

輸出

$ ./pal.sh 
input number 
101 
pallindrome 
$ ./pal.sh 
input number 
102 
not pallindrome 
+0

你真的需要'/ dev/stdin'嗎?當沒有給出文件名稱時,'rev'肯定會從標準輸入讀取。 –

+0

Thanks.I'm剛開始bash shell編程,所以我不理解上面使用的「rev」。 – furiousNoob

+0

@ user3224936這是另一個命令(來自util-linux); [這裏](http://ss64.com/bash/rev.html)是手冊頁(或使用'man rev')。 –