2017-04-25 31 views
0

我有一個由 Python腳本生成的bash命令:Bash腳本有意外的標記`;;'

platform=$(case $(uname) in 
    "Linux") echo "linux-x86_64" ;; 
    "Darwin") echo "darwin64-x86_64-cc" ;; 
    *) echo "Unknown" esac); 
cp -r $SRCDIR $OUT && cd $OUT && ./Configure shared $platform --prefix=$OUT/build --openssldir=$OUT/build/openssl && make && make install 

當我嘗試執行它,我收到以下錯誤:

unexpected token `;;'

我做了什麼錯在這裏?

我是最新的macOS。

+0

http://stackoverflow.com/questions/34502492/how-to-use-case-esac-in-process-substitution –

回答

3

關於「Linux」情況下的關閉)正在終止進程替換。由於它是bash中,只要使用的情況下匹配的括號:

platform=$(case $(uname) in 
    ("Linux") echo "linux-x86_64" ;; 
    ("Darwin") echo "darwin64-x86_64-cc" ;; 
    (*) echo "Unknown";; 
    esac 
) 

(另請注意,我不得不默認情況後添加;;。)

4

一個更清晰,更有效的方式來編寫代碼將是:

case $(uname) in 
    "Linux") platform="linux-x86_64" ;; 
    "Darwin") platform="darwin64-x86_64-cc" ;; 
    *) platform="Unknown" ;; 
esac 

具有echo$()捕捉到的結果是一個shell反模式的東西。爲什麼要直接使用文本時寫入標準輸出和從標準輸入讀取?

+2

我正在辯論投票或刪除我自己的答案!不確定刪除是否正確,因爲不匹配的關閉paren可能是一個常見的錯誤來源,但這種解決方案更適合這種情況。 –

0

我會使用類似:

get_platform() { 
     case "${1,,}" in 
       darwin*) echo darwin64... ;; 
       freebsd*) echo freebsd... ;; 
       linux*) echo linux-x86_64.. ;; 
       cygwin*) echo cyg... ;; 
       *) return 1;; 
     esac 
     return 0 
} 

platform=$(get_platform "$OSTYPE" || get_platform $(uname)) 
echo "${platform:-Unknown}" 

仔細檢查 - 操作系統bash存儲在$OSTYPE變量。如果失敗(其他shell),它仍然嘗試使用uname

如果未檢測到操作系統,最終決定將填充到主腳本(return 1),以便您可以根據需要檢查和調整它,如echo "${platform:-Unknown}"