Powershellでyqバージョン4.34.1を使用しています。
in値を変数の新しい値に置き換えようとしています.spec.source.targetRevision
。だから私が今やっていることは次のとおりです。target.yaml
$newTargetRevision
$newTargetRevision = "v1.1.1-1"
yq -i '.spec.source.targetRevision = "$newTargetRevision"' target.yaml
私が得るものは次のとおりです。
spec:
source:
targetRevision: &default $newTargetRevision
私は次のものを得ることを期待しています: -
spec:
source:
targetRevision: &default v1.1.1-1
また、次のように二重引用符を削除しようとしましたが、$newTargetRevision
yamlファイルの値はまったく更新されません。
yq -i '.spec.source.targetRevision = $newTargetRevision' target.yaml
成功していないままたくさん試してみました。何か提案してもらえますか?
ありがとう
答え1
問題は、シェルが変数を一重引用符で囲んだ文字列の値に拡張すると期待していることです。これはUnixシェルでは何もしません。最も重要なのは、変数値に二重引用符などの特定の文字が含まれていないと仮定することです。
Mike Farahのユーティリティを使用してシェル変数の値をYAML文書に正しく挿入(注入するのではなく)するには、環境から変数の値を読み取るyq
ことができます。env()
newrevision=$newTargetRevision \
yq -i '.spec.source.targetRevision = env(newrevision)' target.yaml
これにより、環境変数がnewrevision
変数値に設定され、newTargetRevision
内部編集中に文書の正しい場所で変更されます。変数をエクスポートし、newTargetRevision
名前をenv()
。
テスト:
$ cat target.yaml
spec:
source:
targetRevision: &default v1.0
$ newTargetRevision='v1.1 "kangaroo"'
$ newrevision=$newTargetRevision yq -i '.spec.source.targetRevision = env(newrevision)' target.yaml
$ cat target.yaml
spec:
source:
targetRevision: &default v1.1 "kangaroo"
答え2
いよいよ理解できますね。以下はpowershellでうまく機能します。
yq -i ".spec.source.targetRevision = `"${newTargetRevision}`"" target.yaml