bash は拡張変数にアポストロフィを追加します。

bash は拡張変数にアポストロフィを追加します。

各行は、次のような複数の列で構成されたbashスクリプトからファイルを読み取ります。

ANSIBLE 'first run' '--diff --extra-vars "client=yes fast=no"'

ご覧のとおり、行はアポストロフィ内にスペースがある3つの列で構成されています。 3番目の列には、呼び出すバイナリのオプションが含まれています。ファイルを読み込むときは、次のオプションを変数に保存します。

custom_options=${columns[2]}

これは次のように評価されます。

custom_options='--diff --extra-vars "client=yes fast=no"'

次に、次のオプションを使用してバイナリを実行したいと思います。

ansible-playbook $custom_options site.yml

ただし、実行時に内部文字列の周囲にアポストロフィが追加されるため失敗します。

ansible-playbook --diff --extra-vars '"client=yes fast=no"' site.yml

変数文字列をそのまま置き換える方法を知っている人はいますか?

以下は、動きをすばやく再現するための短いスクリプトです。

#!/bin/bash
set -x
touch "as is"
command='-name "as is"'
find . $command -type f

答え1

解決策ではなく解決策を見つけました。コマンド全体を式内の変数にまとめましたeval

eval "ansible-playbook $custom_options site.yml"

以下はサンプルスクリプトの同等の使い方です。

...
eval "find . $command -type f"

私はbashの専門家ではなく、この回避策に副作用があるかどうかわかりません。それにもかかわらず、以下をテストしました。

  • evalはパイプで動作します。eval "command | tee file"
  • evalの中に引用符を付けることができます:eval "command \"${var}\""

私の要件に合ったが、汚い感じがした。より良いソリューションを歓迎します。

関連情報