2013-05-20 125 views
3

我正在嘗試寫我的第一個Bash腳本。我正在嘗試創建一個腳本來啓動我的主流遊戲虛擬機,以便我可以從任何目錄啓動它。以下是我迄今爲止:簡單Bash腳本的幫助

#!/bin/bash 
if [[ -n "$1" ]]; 
    then 
    if [["$1" == "up"]]; 
     then cd /home/user/DevEnv && vagrant up; 
    elif [["$1" == "halt"]]; 
     then cd /home/user/DevEnv && vagrant halt; 
    fi 
else 
    echo "Must pass up or halt to script"; 
fi 

當我運行此我得到以下輸出

[email protected] ~ $ dev 
Must pass up or halt to script 
[email protected] ~ $ dev up 
/home/user/bin/dev: line 5: [[up: command not found 
/home/user/bin/dev: line 7: [[up: command not found 
[email protected] ~ $ dev halt 
/home/user/bin/dev: line 5: [[halt: command not found 
/home/user/bin/dev: line 7: [[halt: command not found 

最後其他人似乎能正常運行,但then之後的命令似乎顛沛流離之後被打破。我認爲我正在做一些簡單的錯誤。我最終希望將參數作爲變量,然後將變量傳遞給流浪者,但現在看起來更加複雜。

+1

將[s]放在[[]]和其他所有東西之間。它們是單獨的命令。 「]]應該是」up「]] –

回答

7

您需要空格將[[]]與它們之間的代碼分開。例如:

elif [[ "$1" == "halt" ]]; 
    then cd /home/user/DevEnv && vagrant halt; 
fi 

這是case發言很好用的,還有:

case "$1" in 
    up) 
     cd /home/user/DevEnv && vagrant up 
     ;; 
    halt) 
     cd /home/user/DevEnv && vagrant halt 
     ;; 
    *) 
     echo "Must pass up or halt to script" 
     ;; 
esac 
+0

該開關工作完美!謝謝。 –

3

你尾隨;是沒有用的。我也不明白你爲什麼把那個then放在那裏,你可以把它們放在與條件相同的線上。此外,你爲什麼加倍你的括號?我也被告知,你需要在括號內的空格。 您的代碼應該是這樣的:

#!/bin/sh 

if [ -n "$1" ]; then 
    if [ "$1" = "up" ]; then 
     cd /home/user/DevEnv && vagrant up 
    elif [ "$1" = "halt" ]; then 
     cd /home/user/DevEnv && vagrant halt 
    fi 
else 
    echo "Must pass up or halt to script" 
fi 

這就是我寫我的bash腳本的方式,但你可以保持then S於單獨的行。如果你這樣做,你可以刪除分號。

我不使用vagrant,所以我不能檢查你的腳本,但我給你的版本應該正常運行。

+3

這是一個很好的建議,只不過'''在你的shell中工作是由於'bash' /'ksh' /'zsh'是非常這個標準只允許'='使用單括號表示''',因此通常最好使用'[「$ {foo}」=「$ {bar}」]'(POSIX)*或*'[[ 「$ {foo}」==「$ {bar}」]]',但不是一些可能工作的中間組合,但不應該依賴於這些組合,儘管如此,我仍然認爲這會尖叫'case'。 - ) –

+0

抱歉,沒有看到==。我來自C背景,它並沒有讓我震驚,並且+1爲使用案例。 – Mathuin

+0

我冒昧地在修改中修改,以便我可以+1現在回答:-) –