2014-02-25 142 views
2

我有一個非常簡單的bash腳本(test.sh)麻煩:麻煩bash腳本設置變量

if [ $# >=1 ] 
then 
    backup_file=$1 
else 
    backup_file=~/standard.tar.bz2 
fi 

echo $backup_file 

如果我傳遞一個參數:

test.sh myfile 

我得到預期的輸出:myfile

否則,我得不到輸出。我期待看到(當test.sh執行時沒有參數):~/standard.tar.bz2

我在做什麼錯?

+0

隨意利用[tag wiki](http://stackoverflow.com/tags/bash/info)上列出的資源,如[shellcheck](http://www.shellcheck.net)它會自動診斷這樣的事情。 –

回答

4

這種狀況評估的問題是:

[ $# >=1 ] 

更改爲:

[ $# -ge 1 ] 

或者在BASH:

[[ $# -ge 1 ]] 

OR:

(($#)) 
  • [...][[...]]不允許>=作爲一個經營者
  • 您需要運營商後的空間。
+0

是的,這真是愚蠢的我,謝謝! –

+1

或'(($#))',或'[-n「$ 1」]''。最後一個稍有不同,但在某些情況下可能更有價值。 – kojiro

+0

是的,謝謝,'(($#))'最短(編輯) – anubhava

3

如果您使用的是數學運算符,請在正確的上下文中使用它。不要說:(你不必擔心周圍的經營空間,或缺乏)

if [ $# >=1 ] 

if (($# >=1)) 

3

其他人已經解決了眼前的問題語法,但完全不同的方式來寫這將是利用parameter expansion to use a default value

backup_file="${1:-$HOME/standard.tar.bz2}" 

當且僅當它存在時,這將用$1中的值替換backup_file。

+1

你仍然可以用'〜'代替'$ HOME'作爲默認值。 – chepner

+0

@chepner的權利,但我真的更喜歡在腳本中的HOME,因爲〜做了一些其他擴展,可能是不可取的(即使它們不太可能偶然發生)。給他自己的。 (http://stackoverflow.com/questions/5930671/why-use-home-over-tilde-in-a-shell-script) – kojiro

+0

+1!如果我可以接受多個答案,我也會給你第二個選中標記。 –