Bashの変数に出力を割り当てる


164

私はcURLの出力を次のような変数に割り当てようとしています:

#!/bin/sh
$IP=`curl automation.whatismyip.com/n09230945.asp`
echo $IP
sed s/IP/$IP/ nsupdate.txt | nsupdate

ただし、スクリプトを実行すると、次のようになります。

./update.sh: 3: =[my ip address]: not found

出力を$IP正しく取得するにはどうすればよいですか?


受け入れられた答えは正しいですが、その例とここにあるものの間には別の小さな違いがあります。echoに渡された$ IP変数が二重引用符で囲まれていない場合、キャプチャされたcurl出力の最後の行のみが出力されます。
クリストファーハンター

@ChristopherHunterのおかげで、私はこれを探しているだけでここに来ました。なぜそれがこのように振る舞うのですか?
アミー

@Amey理由を正確に述べることはできません。これが、複数行の文字列を引数として指定したときのエコーの動作です。
クリストファーハンター

回答:


287

シェルでは、割り当てる変数の前に$を付けません。変数を参照する場合にのみ$ IPを使用します。

#!/bin/bash

IP=$(curl automation.whatismyip.com/n09230945.asp)

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate

2
の出力と進行状況バーを抑制する方法はありcurlますか?空の-silent葉を追加してい$IPます...
Dror

4
@Drorはcurl、ノイズの多い出力をstderr に送信するため、このようなスクリプトの場合、進行状況バーは無視する必要があります。それにもかかわらず、--silentまたは-sうまく動作します。お困りの際はご質問ください。
ghoti

curl -s進行状況バーとエラーメッセージを無効にするために使用します。
Searene

あなたは、常にリダイレクトすることができますstderrIP=$(curl <url> 2>/dev/null)
BallpointBenを

$()構文で見つけると、環境変数を使用できません。たとえば、電子メールをハードコーディングする代わりに、$ 2、$ 3を変数として使用します。これらがレンダリングされない理由に関するアイデアはありますか?
エヴァンBurbidge

27

もっと複雑なことと同じ...インスタンス内からec2インスタンス領域を取得します。

INSTANCE_REGION=$(curl -s 'http://169.254.169.254/latest/dynamic/instance-identity/document' | python -c "import sys, json; print json.load(sys.stdin)['region']")

echo $INSTANCE_REGION

これは私がbashスクリプトで行っていたこととまったく同じであり、jqをapt-get installする必要がなくなりました!
Nungster 2017年

これはどのようにWindowsで実行できますか?私が代わり場合$os.system、INSTANCE_REGIONは、出力の値を持っていません。
ハインツ

複数行を作成する方法は?
Khalil Gharbaoui
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.