转义linux命令

转义linux命令

我正在尝试从我编写的脚本运行命令,该脚本基本上替换文件中的字符串

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\"'

如果单引号不起作用,我也会检查双引号,但我认为它们应该。

相关内容