使用yq v4读取YAML中PEM密钥时如何保留末尾换行符?
解决Bash中用yq v4读取PEM密钥并保留末尾换行的问题
方法1:使用read -d ''读取输出
Bash的$()会自动移除命令输出末尾的换行符,但可以用read命令结合进程替换完整保留所有内容(包括末尾换行):
# 假设YAML文件为config.yaml,目标字段为.tls.privateKey read -d '' pem_key < <(yq eval '.tls.privateKey' config.yaml)
原理
read -d ''会持续读取输入直到遇到空字符,而yq的输出默认不包含空字符,因此会读取完整的输出流。- 进程替换
<()会完整传递yq的输出字节,包括末尾的换行符,不会被截断。
方法2:利用参数扩展补回末尾换行
如果更习惯用$()赋值,可以通过添加特殊标记再移除的方式保留换行:
# 读取时追加一个非换行特殊字符,再移除该字符 pem_key=$(yq eval '.tls.privateKey' config.yaml; printf '\x01') pem_key=${pem_key%$'\x01'}
原理
printf '\x01'添加一个不会被$()识别为末尾换行的特殊字符,避免原始换行被移除。${pem_key%$'\x01'}用参数扩展去掉最后添加的特殊字符,还原包含末尾换行的原始PEM内容。
验证换行是否保留
可以用以下命令确认变量是否正确保留了末尾换行:
# 统计变量的总字符数(包含末尾换行) echo -n "$pem_key" | wc -c # 查看变量的转义形式,确认末尾存在\n printf "%q\n" "$pem_key"
内容的提问来源于stack exchange,提问作者Mazzy
相关产品推荐
相关产品推荐

