Bash "$@"は変数を置き換えません。

Bash "$@"は変数を置き換えません。

申し訳ありません。誰かがこの質問をしたかもしれませんが、これらの特殊文字を正しく検索できません。

私は以下を持っていますscript.sh

#!/bin/bash

export c=23;

"$@"

私がそれを呼び出すとき:

(export a=231; export b=45; ./script.sh echo "$a, $b, $c")

変数は$c出力に表示されません。

231, 45,

実行されたコマンドに追加の変数を追加するパススルースクリプトをどのように作成できますか?


内容全体を見るにはもう一度編集してください。

使い方はドッカーコンテナがあるということです。 dockerfileはビルド時にCOMMIT_HASHを取得します。次に(コンテナの実行のために)呼び出して、java app.jarその実行プロセスをCOMMIT_HASH変数として設定する必要があります。

それで、Dockerfile今では次のようなものがありました。

RUN echo "#!/bin/bash \n java -Dapp.info.commit-hash=\"${COMMIT_HASH}\" -jar /app.jar \"\$@\"" > ./entrypoint.sh

...

ENTRYPOINT ["./entrypoint.sh"]

ご覧のとおり、この設定ではjarのパラメータを設定できません。しかし、コンテナの外部で完全なコマンドを生成して変数を置き換える方法はわかりません。

そのため、理想的には追加の変数を指定できるだけでなく、変数をデフォルト値に設定できるスクリプトを持ちたいと思います。

これが最後のスクリプト(現在のDockerfileを使用していない)が次の理由です。

#!/bin/bash

export COMMIT_HASH=a982321bc232d;

"$@"

その後、一緒にマージします。

# read from a .env file or something - these are dynamic values
export PORT=8081;
export FRONTEND_URL=http://example.com;

java -Dapp.info.commit-hash="${COMMIT_HASH}" -Dserver.port="${PORT}" -jar /app.jar --FRONTEND_URL="${FRONTEND_URL}"

答え1

スクリプトを呼び出すときは、for imprintをエスケープし、$cスクリプトでeval "$@"2番目の変数拡張を実行する必要があります。

$ cat script.sh
#!/bin/bash

export c=23;

eval "$@"
$ (export a=231; export b=45; bash -x ./script.sh echo "$a, $b, \$c")
+ export c=23
+ c=23
+ eval echo '231, 45, $c'
++ echo 231, 45, 23
231, 45, 23

または、スクリプトコードに一重引用符を送信し、スクリプトシェルですべての変数を拡張するようにします。

$ (export a=231; export b=45; bash -x ./script.sh 'echo "$a, $b, $c"')
+ export c=23
+ c=23
+ eval 'echo "$a, $b, $c"'
++ echo '231, 45, 23'
231, 45, 23

関連情報