Linux 动态初始化sed转换的变量

Linux 动态初始化sed转换的变量,linux,bash,sed,Linux,Bash,Sed,我想在shell脚本中使用.yml中定义的变量。yaml中的变量形式为变量:值。在我正在尝试的脚本中: sed 's/\s*:\s*/=/' *vars.yml* echo $variable 但是echo不返回任何内容。这是在shell脚本中实现此类操作的一种方法吗?将命令的输出作为源,例如 $cat vars.yml var1: value1 var2: value2 var3: value3 $ cat 1.sh source <(sed 's/\s*:\s*/=/' *var

我想在shell脚本中使用
.yml
中定义的变量。yaml中的变量形式为
变量:值
。在我正在尝试的脚本中:

sed 's/\s*:\s*/=/' *vars.yml*  
echo $variable

但是
echo
不返回任何内容。这是在shell脚本中实现此类操作的一种方法吗?

将命令的输出作为源,例如

$cat vars.yml
var1: value1
var2: value2
var3: value3
$ cat 1.sh
source <(sed 's/\s*:\s*/=/' *vars.yml*)
echo $var1
echo $var2
echo $var3

请您尝试以下方法:

while IFS= read -r line; do
    declare "$(sed 's/[[:blank:]]*:[[:blank:]]*/=/' <<< "$line")"
done < file.yml

echo "$var1"
echo "$var2"
输出:

value1
value2
[解释]

  • while
    循环使用
    read
    逐行读取输入文件
    file.yml
    将变量
    分配给每个记录
  • 语法
    declare var=value
    创建一个名为
    var
    的变量,然后 将其分配给
    。命令
    declare
    不仅接受文本 赋值,但作为赋值计算的表达式。 在这种情况下,
    sed
    命令将行
    var1:value1
    转换为
    var1=value1
    然后
    declare
    执行赋值
  • 通常不建议使用
    eval
    ,除非您有完整的 由于潜在的安全风险,对输入文件进行独占控制。 想象一下,某个邪恶的家伙在文件中添加了一行
    rm-rf ~/
    ,结果是
    eval
    ed不知道。 使用
    declare
    应该比
    eval
    风险小

将您的.yml文件和该示例输入的所需输出添加到您的问题中(无注释)。
sed
不会运行替换结果。您没有将sed的输出分配给$variable,如果没有对code@l00p谢谢你的反馈。我在回答中加了一个解释。希望有帮助。谢谢!这正是缺少的,因为
eval
将执行编辑的字符串,从而创建一个变量。
while IFS= read -r line; do
    declare "$(sed 's/[[:blank:]]*:[[:blank:]]*/=/' <<< "$line")"
done < file.yml

echo "$var1"
echo "$var2"
var1: value1
var2: value2
value1
value2