使用yq处理YAML时如何保留值的引号避免Bash环境变量截断?
解决YAML读取环境变量时含空格值被截断的问题
问题重现
配置文件 config.yaml
APP_ID: APP158 APP_NAME: "My Application"
处理脚本 process-config.sh
#!/bin/bash export $(yq e "to_entries | map(.key + \"=\" + .value) | join(\" \")" config.yaml) echo $APP_ID echo $APP_NAME
执行脚本后输出如下:
APP158 My
可以看到APP_NAME的值因包含空格被截断,只输出了My,该如何解决?
解决方案
修改后的脚本如下:
#!/bin/bash eval $(yq e 'to_entries | map(.key + "=\"" + .value + "\"") | join(" ")' config.yaml) echo "$APP_ID" echo "$APP_NAME"
说明
- 调整yq输出格式:把yq的处理逻辑改成生成
KEY="VALUE"的格式,给每个变量值加上双引号,让带空格的内容被完整包裹,比如生成APP_NAME="My Application"。 - 改用eval执行:直接用
export $(...)时,Bash会把空格当作变量分隔符,引号会被当作普通字符忽略;用eval可以让Bash正确解析带引号的赋值语句,保留变量值里的空格。 - 输出变量加引号:
echo "$APP_NAME"能确保输出时变量的完整值被打印,不会因为空格再次被拆分。
执行修改后的脚本,输出会变成:
APP158 My Application
内容的提问来源于stack exchange,提问作者Jonny Rylands
相关产品推荐
相关产品推荐

