我正在尝试从我编写的脚本运行命令,该脚本基本上替换文件中的字符串
vzctl exec VZID sed -i 's/\/>/address="$IP\/255.255.255.0"\/\>/' "file.xml"
问题是命令丢失了'
和"
有没有一种方法可以转义命令以保留'
and "
?或者以某种方式封装它?
答案1
据推测,这vzctl exec
就像eval
.也就是说,它构建了一个壳命令行来自它接收到的参数的串联。因此,您应该向它传递一个有效的 shell 命令行作为参数,这意味着另一个级别的引用。
vzctl exec VZID '
sed -i '\''s/\/>/address="$IP\/255.255.255.0"\/\>/'\'' "file.xml"'
请注意,$IP
将不是被扩大。为此,您需要:
vzctl exec VZID '
sed -i '\''s/\/>/address="'"$IP"'\/255.255.255.0"\/\>/'\'' "file.xml"'
要通过解释该命令的 shell 来扩展它vzctl
,或者:
vzctl exec VZID '
sed -i '\''s/\/>/address="'\''"$IP"'\''\/255.255.255.0"\/\>/'\'' "file.xml"'
以便由调用的 shell 对其进行扩展vzctl exec
(假设 shell 可以访问此类$IP
变量)。
请注意,为了清楚起见,使用此处文档并将代码存储在变量中可能更容易,例如:
code=$(cat <<EOF
sed -i 's|/>|address="$IP/255.255.255.0"/>|' file.xml
EOF
)
(此处文档的这种形式确实扩展了变量(此处$ID
))。
并将其运行为
vzctl exec VZID "$code"
答案2
您是否尝试过将整个命令用引号引起来并用反斜杠分隔内部?
我是说:
vzctl exec VZID 'sed -i \'s/\/>/address=\"$IP\/255.255.255.0\"\/\>/\' \"file.xml\"'
如果单引号不起作用,我也会检查双引号,但我认为它们应该。