如何将YAML文件内容存入Shell变量并保留原YAML结构?
保留YAML格式的解决方案
要让替换后的变量保留原YAML的换行和缩进结构,核心是在变量赋值和输出环节都用双引号包裹,防止shell自动压缩空白字符。
方法一:简化命令+双引号包裹
- 先设置目标变量值(示例):
export MYVARVALUE=example.com - 替换内容并赋值变量时,用双引号把命令替换结果包起来:
(直接用template="$(sed "s/domain/$MYVARVALUE/g" file.yaml)"sed读取文件比cat | sed更高效,省去不必要的管道) - 输出变量时同样加上双引号:
echo "$template"
方法二:用read命令捕获完整内容(适配特殊场景)
如果你的YAML文件末尾没有换行,或者包含特殊字符,用read命令能更稳妥地捕获完整格式:
IFS= read -r -d '' template < <(sed "s/domain/$MYVARVALUE/g" file.yaml) echo "$template"
IFS=避免文件开头的空白字符被截断-r禁止shell解析反斜杠转义-d ''让read直到遇到空字符才停止,确保捕获整个文件的所有内容
原命令的问题
你原来的写法template=$(cat "file.yaml" | sed "s/domain/$MYVARVALUE/g")没有用双引号包裹命令替换结果,shell会把输出里的换行、多空格全部替换成单个空格,直接丢失格式。而echo $template也没加双引号,会进一步压缩空白,最终输出就是杂乱的一行内容。
内容的提问来源于stack exchange,提问作者Dhanu
相关产品推荐
相关产品推荐

