2016-07-10 8 views
2

私はこれが永遠に返しバッシュ

#!/bin/bash 
MYFILE=/home/me/.config/i3/pia 
while true 
do 
    IP_EX=$(wget http://ipinfo.io/ip -qO - | cut -d"." -f1,2,3) 
    if [[ "$IP_EX"=="173.199.65" ]] 
    then 
     echo file created 
     touch $MYFILE 
    else 
     echo file deleted 
     rm -f $MYFILE 
    fi 
    echo sleeping 
    sleep 4 
done 

以下1「ファイル作成」、および他の文で私の外部IP(最初の3バイト)を比較する小さなスクリプトを記述しようとしています決して実行されません。これは$ IP_EXを "何でも"と置き換えた場合でも同じです。

+0

代わりにsingle =代わりに==とsingle []]を使用してみてください –

+0

まだ返信はtrue:/ – vecdot

答えて

1

バッシュコマンドはスペースに敏感です。 ==の周りにスペースを追加する必要があります。

が、これは間違った答えを与えることを確認:これとは対照的に

$ IP_EX=abc; [[ "$IP_EX"=="173.199.65" ]] && echo True 
True 

は、このバージョンは、スペースで、正常に動作します:

$ IP_EX=abc; [[ "$IP_EX" == "173.199.65" ]] && echo True 
$ 

問題は、bashが1つの文字列として"$IP_EX"=="173.199.65"を見ています。 [[ trueを返し、そのような単一の引数を、与えられたとき、それが空の場合、文字列が空で偽でない場合:に追加されたスペースで

$ [[ "" ]] && echo True 
$ [[ "1" ]] && echo True 
True 

、bashは中央の引数は==ことで"$IP_EX" == "173.199.65" 3などの引数を見ています。したがって、それは平等のためにテストします。これはあなたが望むものです。

+1

AHA素晴らしいことでした。 – vecdot