2015-04-14 60 views
-1

這是我的腳本:bash腳本,檢查數值變量在範圍

#!/bin/bash 
JOB_NUM=4 

function checkJobNumber() { 
    if (($JOB_NUM < 1 || $JOB_NUM > 16)); then 
     echo "pass" 
    fi 
} 

... 
checkJobNumber 
... 

當我嘗試啓動腳本中,我得到的消息:

./script.sh line 49: ((: < 1 || > 16 : syntax error: operand expected (error token is "< 1 || > 16 ") 

(請注意在空間錯誤信息)

我真的不明白是什麼問題。如果我在命令行手動執行評估,它就可以工作。

此外,我嘗試了像if [[ "$JOB_NUM" -lt 1 -o "$JOB_NUM" gt 16 ]]; ...不同的評價...仍然沒有成功。

+0

看起來好像'JOB_NUM'可能在函數被調用時未被設置;但是,bash算術不需要'$'擴展。如果你寫了'((JOB_NUM <1 || JOB_NUM> 16))',即使變量未設置,它也會在語法上有效 - 在這種情況下,它將評估爲零。 – kojiro

+0

如果我按照Mat的說法,在錯誤發生之前,我在輸出中得到字符串「Job number is:[]」。我仍然不明白我做錯了什麼。順便說一下,我的JOB_NUM = 4賦值最初是一個JOB_NUM = $ 1賦值(腳本的直接參數)。 – CaptainPhlegm

+0

我還應該提到我的函數都在腳本之上,在調用函數之前我沒有對變量做任何事情。我只是不'複製代碼,因爲它太離題了。 – CaptainPhlegm

回答

0

UPDATE:建議我在函數調用之外的代碼的其餘部分做了幾次嘗試,並且發現了這個問題。

我的變量聲明實際上是縮進這樣:

JOB_NUM=   4 
THREAD_NUM=   8 
..... 
VERY_LONG_VAR_NAME= 3 

,顯然這種軟管計算結果爲。呸!它以前一直在爲我工作,那爲什麼不現在呢?

如果我刪除空格,評估工作:

JOB_NUM=4 
THREAD_NUM=8 
.... 
VERY_LONG_VAR_NAME=3 

OK我恨正式bash。 。 。嘆:(

+2

如果你打算忽略語言的語法,那麼是的,你會討厭結果。我保證在賦值中的'='之後加上空白符*從不*工作,不在'bash'中,而不在任何'sh'派生的shell中。 – chepner

+1

不要提起抱怨抱怨,你沒有向我們展示你在問題中的實際代碼......空白問題。 – kojiro

+0

'JOB_NUM = 4'甚至不是shell腳本中的有效行。運行會給你一個錯誤,'4'不是一個命令。 –

0

這將正常工作

#!/bin/bash 
JOB_NUM=7 

function checkJobNumber() { 
if [ $JOB_NUM -lt 0 ] || [ $JOB_NUM -gt 16 ] ; then 
    echo "true" 
else 
    echo "false" 
fi 
} 


checkJobNumber 

如果你想在測試過程中,檢查變量,你可以在你的bash寫:

集-u

,這將產生一個消息像「JOB_NUM:unbound variable」,如果變量設置不正確