【发布时间】:2019-08-11 22:35:17
【问题描述】:
我想用 bash 将 $ip 变量的值传递到文件 /etc/test.json。
ip="xxxx"
sudo bash -c 'cat > /etc/test.json <<EOF
{
"server":"$ip",
}
EOF'
我希望/etc/test.json 的内容是
{
"server":"xxxx",
}
然而/etc/test.json中的真实内容是:
{
"server":"",
}
但是如果我用/tmp替换目标目录/etc/
ip="xxxx"
cat > /tmp/test.json <<EOF
{
"server":"$ip",
}
EOF
$ip 变量的值被传递到/tmp/test.json:
$ cat /tmp/test.json
{
"server":"xxxx",
}
在Kamil Cuk's 示例中,子进程是cat > /etc/test.json,其中不包含任何变量。
sudo sh -c 'cat > /etc/test.json' << EOF
{
"server":"$ip",
}
EOF
它根本不导出$ip 变量。
现在我们来分析一下:
ip="xxxx"
sudo bash -c "cat > /etc/test.json <<EOF
{
"server":\""$ip"\",
}
EOF"
中的不同部分
"cat > /etc/test.json <<EOF
{
"server":\""$ip"\",
}
EOF"
将连接成一个长字符串并作为命令。为什么$ip变量可以在这里继承其父进程的值?
【问题讨论】:
-
Shell 变量没有用单引号展开。
-
使用
jq之类的工具来生成 JSON,而不是字符串插值(存在引用错误的风险)。