2012-04-15 9 views
3

I次のスクリプトは、(外部サービスからの私の現在のIPを取得する)があります。バッシュ:内部使用単一引用符変数

#!/bin/bash 
#################################################################### 
# Gets the public IP address of current server 
#################################################################### 

cmd='curl -s' 
#cmd='wget -q -O' 
#cmd='lynx -dump' 

ipservice=checkip.dyndns.org 

pipecmd="sed -e 's/.*Current IP Address: //' -e 's/<.*\$//'" 

# Run command 
echo $($cmd $ipservice | $pipecmd) 

しかし、sedコマンドは文句:

sed: -e expression #1, char 1: unknown command: `'' 

私がされています変数内で単一引用符を使用して成功することはありません。

ありがとうございます!

答えて

5

コマンドは//'などの言葉sed-e's/.*CurrentIP、​​、に分割されているので、sedプログラムの最初のコマンドは、実際に有効なsedコマンドではありませんこれは、'で始まります。 echo "$(command)"commandと同等であることを

cmd=(curl -s) 
pipecmd=(sed -e 's/.*Current IP Address: //' -e 's/<.*$//') 
"${cmd[@]}" "$ipservice" | "${pipecmd[@]}" 

注:配列し、代わりに引用を使用してください。一般的には、常にすべての変数を引用するようにしてください(ただし、例外はあります)。

+0

ありがとうございます!それはコマンドを実行しましたが、何らかの理由でsed抽出が必要なだけ正確に動作しません(IPアドレスのみではなく、IPと後続のコンテンツを取得しています)。 – yorch

+0

@yorch:おそらくドル記号をエスケープする必要があります(結果テキストにリテラルドルが含まれていない限り)。 – Philipp

+0

@Phillip、あなたは完全に正しい、私の間違いです – yorch

3

は、あなたは、この特定のケースでは、私があるとして、それは大丈夫だと思いますが、あなたは、ため、余分な評価のエスケープを余分に必要になることがあり、変数の内容

echo $($cmd $ipservice | eval $pipecmd) 

を解釈するためにシェルを取得するためにevalを使用する必要があります。

+0

ありがとう!それは完璧に働いた! – yorch

+1

評価は悪です。それを使用しないでください。 – Philipp

+0

@Philipp私はあなたの意見を参照してください(http://mywiki.wooledge.org/BashFAQ/048)、ありがとう! – yorch

関連する問題