2017-09-30 4 views
0

自分のドットファイルを統合しようとしていますので、ローカルのOSXマシンとLinuxサーバ用に1つしか設定していません。私は、この条件文を持っているが、$(brew --prefix)は、そのブロックが実行すべきではありませんにもかかわらず、Linuxマシン上で実行されている...bash:条件が満たされていないときにこのコマンドが実行されるのはなぜですか?

SYSTEM=`uname -a | cut -d" " -f1` 
# These things are system specific 
if [ $SYSTEM=="Darwin" ]; then 
    if [ -f $(brew --prefix)/etc/bash_completion ]; then 
     . $(brew --prefix)/etc/bash_completion 
    fi 

    for file in ~/.completion/* ; do 
     if [ -f "$file" ] ; then 
     . "$file" 
     fi 
    done 

elif [ $SYSTEM=="Linux" ]; then 
    alias upgrade='sudo apt-get update && sudo apt-get upgrade' 

    # save the IP address in case I need it later 
    export IP_ADDRESS=`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` 
fi 

私はLinuxマシン上で$SYSTEM変数をエコーた場合、それはLinuxが、ソーシングのであると言いますbashrcはbrew --prefixコマンドで失敗します。

何があってもその変数を評価しますか?私はそれを変更する方法はありますか?

+0

'=='の前後に空白を入れてください。また、https://stackoverflow.com/questions/2237080/how-to-compare-strings-in-bash – Evert

+0

ヒント:[ShellCheck](http://www.shellcheck.net)は自動的に[この問題]を特定します( https://github.com/koalaman/shellcheck/wiki/SC2077)やその他のよくある問題があります。 –

答えて

3

あなたは==周りのスペースが必要になります。

if [ $SYSTEM == "Darwin" ] 

あなたが書かれたかのようにそれ以外の場合はbashが動作します。

とは反対に、常に trueある
if [ "some-non-empty-string" ] 

if [ "" ] 

常にfalseです。

+0

また、単一の等号( '=')は '[]'の標準です。 bashはシノニムとして '=='を許可しますが、他のシェルでは必ずしも動作しません。変数参照を二重引用符で囲むことは常に良い習慣です(例えば、 '$ SYSTEM" = "Darwin") ') –

関連する問題