${var}
bashに中括弧変数(例)のみを拡張し、一般変数(例:)を無視するようにするbashオプションや他の方法はありますか$var
?
更新 - 私が望む理由は次のとおりです。純粋なbashに残る必要がある比較的大きなプログラムは純粋なbashで書かれています(ほとんどのLinuxディストリビューションで実行するように設計されたインストーラなので、追加の依存関係を追加したくありません)。 Bashで書かれた非常にシンプルなテンプレートエンジンがあります。テンプレート解析コードは次のとおりです(すべて)。
function apply_template() {
local src=$1
local dst=$2
local code="
cat<<EOF
$(cat $src)
EOF
"
eval "$code" > $dst
}
非常にシンプルですが非常に効果的です。このコードで評価されたテンプレートは30個です。例は次のとおりです。
[ {
"host" : "${primary_node_ip}",
"access" : {
"type" : "ssh",
"user" : "${user}",
"key" : "id_rsa"
} ]
Bashは変数を値に置き換え、すべてが正常です。
nginx構成など、変数と見なすべきではない「$」記号がテンプレートに含まれていると問題が発生します。実際、これはnginx confという1つのテンプレートでのみ発生します。
完全な解決策は、私の "apply_template"関数でこのモードを有効にすることです(これまで私が知っている限りは存在しません)。
答え1
いいえ、そこではありません。変数の拡張についてはマニュアルに記載されています。3.5.3 シェルパラメータの拡張
'$'文字は、パラメータ拡張、コマンド置換、または算術拡張を導入します。拡張するパラメータ名または記号は中括弧で囲むことができます。オプションとは何ですか?[...]
本当にこれが必要な場合
- 理由を説明してください。 (XY問題のようです。)
$
識別子の前のすべての項目をエスケープし、間に句読点を置かないようにbashコードを前処理することもできます。
答え2
質問に示されているものと同様のJSONテンプレートがあるとします。
$ cat template
[
{
"host": $primary_node_ip,
"access": {
"type": $access_type,
"user": $user,
"key": $id_rsa
},
"comment": $comment
}
]
シェル変数のように見えるのは、実際にjq
JSONツールのコマンドラインから値を割り当てることができる内部変数ですjq
。これにより、JSONドキュメントに含めるために値が適切にエンコードされます。
jq -n -f template \
--arg primary_node_ip '127.0.0.1' \
--arg access_type SSH \
--arg user "$(id -un)" \
--arg id_rsa "$(cat ~/.ssh/id_rsa.pub)" \
--arg comment "$(cat <<-'END'
Test use only.
Contact "Adam" at [email protected]
for more info.
END
)"
上記のコマンドは、ドキュメントで使用される変数に値を割り当てます。一部の変数には変数の値が割り当てられ、$comment
変数には引用符を含む複数行のテキストが割り当てられます。
この-n
オプションは、jq
ファイルまたは入力ストリームからの追加入力の読み取りを停止します。代わりに、optionsによって提供されたテンプレートファイルの式の結果を生成します-f
。
出力(例):
[
{
"host": "127.0.0.1",
"access": {
"type": "SSH",
"user": "myself",
"key": "ssh-rsa AAAAVERYLONGKEY= [email protected]"
},
"comment": "Test use only.\nContact \"Adam\" at [email protected]\nfor more info."
}
]
このjq
ツールは、私が知っているすべてのLinuxディストリビューションだけでなく、他のすべての現在のUnixバリアントでも機能します。