如何在Bash循环中使用变量作为yq命令的迭代器更新YAML文件?
解决yq在Bash循环中变量替换的问题
问题核心
你在Bash循环里用yq修改YAML文件时,遇到了变量无法正确展开或语法报错的问题:
- 用单引号包裹yq表达式时,Bash不会展开
$i,导致写入字面量$i-something - 改用双引号包裹并在内部加单引号时,yq会因为语法不合法报错
三种可行解决方案
方案1:使用yq的--arg参数(推荐)
yq支持通过--arg参数将Shell变量传递到表达式中,彻底避免引号冲突:
for i in one two three four; do yq -i --arg val "$i-something" '.key = $val' ./$i/file.yaml; done
原理:--arg val "$i-something"把Shell中拼接好的字符串赋值给yq内部的$val变量,yq直接使用该变量即可完成赋值,语法清晰且无冲突。
方案2:转义双引号嵌套
通过转义双引号,让Bash先展开变量,再传递合法的yq表达式:
for i in one two three four; do yq -i ".key = \"$i-something\"" ./$i/file.yaml; done
原理:双引号包裹整个yq表达式时,Bash会先展开$i,内部的\"会被解析为yq能识别的字符串闭合双引号,最终传给yq的是.key = "one-something"这样合法的语法。
方案3:单引号拼接字符串
将yq表达式的固定部分和变量部分用单引号拆分拼接,让Bash展开变量:
for i in one two three four; do yq -i '.key = "'"$i-something"'"' ./$i/file.yaml; done
原理:'.key = "'是yq表达式的前半部分,"$i-something"是Bash展开的变量值,'"'是表达式的后半部分,三者拼接后形成合法的yq语句.key = "one-something"。
原写法失败原因
- 单引号包裹的字符串中,Bash不会解析任何变量,所以
$i被当作字面量传递给yq - 双引号包裹时内部用单引号,展开后会变成
.key = 'one-something',而yq的字符串语法要求用双引号(单引号在yq中用于表示不转义的原始字符串,但此处写法不符合语法规范)
内容的提问来源于stack exchange,提问作者Богдан Божић
相关产品推荐
相关产品推荐

