環境変数に保存されたコマンドの評価

環境変数に保存されたコマンドの評価

変更が制限されているか修正できないbashスクリプトは、次の環境変数を使用します。

"${SERVER_ADDRESS}"

実際のSERVER_ADDRESS値は実行時にのみ動的に決定できるため、IPを検索するcurlコマンドにSERVER_ADDRESSを設定しようとしています。それは次のとおりです。

SERVER_ADDRESS='curl -s http://lookup.api.com'

これをより複雑にするには、実際のルックアップが必要なアドレスの一部だけを返すので、実際に必要なのは一種の接続です。

SERVER_ADDRESS='$(curl -s http://lookup.api.com).restofaddress.com'

これは、文字列が環境変数に割り当てられると、curlコマンドが実行され評価されますが、実行中にスクリプト内で評価を実行する必要があることを意味します。

「${SERVER_ADDRESS}」のみを含むスクリプトが正しい値で終わるように、環境変数のテキスト形式を指定するために可能なすべてを試しましたが、パニックになりました。おそらく、受信スクリプトに複雑さを加えなければ不可能かもしれません。

答え1

一重引用符の代わりに二重引用符を使用してください。

SERVER_ADDRESS="$(curl -s http://lookup.api.com).restofaddress.com"

補間および拡張(たとえば、ここでは変数拡張またはコマンド拡張)は、二重引用符で囲まれた文字列内で実行されますが、単一引用符で囲まれた文字列内では実行されません。

答え2

jayhendrenが言ったように、変数を挿入するには二重引用符を使用する必要があります。ただし、変数名が有効な変数名文字の隣にある場合は、名前を中括弧で囲み、変数名が始まり終わる場所を bash に知らせる必要があります。コードのように見えますが、目的の結果を提供するために実行されていない(または非常にクールなfqdnを生成すること)という点で問題を説明するときに何を意味するのかを理解するのは難しいですが、同様のことを行う必要があると思います。 ..

ADDR="http://lookup.api.com/"
export ADDR
...
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

それとも、実際に検索したいURLが次に返されるフラグメントで構成されているという意味ですか?http://lookup.api.com?それなら大きな棒を見つけて「302! 302! 302!」と叫び、APIを作成した人を繰り返し打ちます。彼らがあなたよりもはるかに大きいか銃を持っているなら、jayhedrenが提案したアプローチを検討することができますが、エレガントでシンプルだが特に強力な解決策ではありません。以下を考慮してください。

FRAG=`curl -s -o "${ADDR}some/path" | tr -d '\040\011\012\015'`
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

関連情報