変数をインラインシェルスクリプトに送信する方法は?


26

次のスクリプトを実行します。

VAR="Test"
sh -c 'echo "Hello $VAR"'

しかし、私は得る:

# ./test.sh
Hello

VAR作成したシェルにスクリプトの変数を送信するにはどうすればよいsh -c '...'ですか?

回答:


44

を使用exportして環境変数に変換するか、コマンドに直接渡します。

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

次のようなコマンドインジェクションの脆弱性が生じるため、シェルコードを二重引用符で囲まないようにしてください。

sh -c "echo 'Hello $ VAR'"

$VARようなものが含まれているときに呼び出された場合、再起動を引き起こす';reboot #


実際には実用的ではありません(いくつかの変数があり、それらを環境変数にしたくないのですが)、うまくいきました!
マチューナポリ

3
@Matthieu:プロセスの子の環境変数として設定されるのは、それが心配な場合のみです。
-Piskvor

5
参考までにexport var="Test"、1行で行うこともできます。
user606723

@Piskvorは精度に感謝します、それは完璧です。
マチューナポリ

9

sh -c(位置引数として)変数を渡す別の方法は次のとおりです。

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}

1
(+1)スクリプト変数の通常の$ 1 $ 2の期待値にさらに合わせるために、$ 0にダミー値を設定できます。これにより $@、期待どおりに機能します。sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O

2
@ Peter.O「_」を使用するのではなく、「sh」または適切な名前を使用してそのコマンドに付け$0ます。これは、シェルによってエラー/警告メッセージに表示されるためです。
ステファンシャゼル

5

それらを環境変数としてエクスポートしたくない場合は、ここで行うことができますトリックです。variabe定義をファイルに保存し、サブシェルで次の.var_init.shようにソースします。

.var_init.sh

VAR="Test"

コマンドラインから:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

この方法では、サブシェルの実行時にのみ変数を設定します。


...またはENV=.var_ini.sh sh -c '...'
Kusalananda

それがあればという注意.var_init.sh現在のディレクトリ(とは対照的に、中を探したことが期待されている$PATH)、それが書かれるべき. ./var_init.sh
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.