3

次のスクリプトがあります(外部サービスから現在の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: `''

変数内で一重引用符を使用して成功しない方法を探し回っています。

ありがとう!

4

2 に答える 2

5

sedコマンドは単語、-e's/.*CurrentIP、などAddress:に分割される//'ため、プログラムの最初のコマンドはsed実際には で始まりますが'、これは有効なsedコマンドではありません。代わりに配列と引用符を使用してください。

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

echo "$(command)"と同等であることに注意してくださいcommand。一般に、常にすべての変数を引用符で囲むようにしてください (ただし、いくつかの例外があります)。

于 2012-04-15T20:35:10.483 に答える
3

evalシェルに変数の内容を解釈させるために使用する必要があります

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

追加の評価のために追加のエスケープが必要になる場合がありますが、この特定のケースではそのままで問題ないと思います。

于 2012-04-15T20:35:42.500 に答える