将命令参数中的单引号转义为sh -c

时间:2018-02-25 04:19:33

标签: linux terminal sh 7zip

我知道这个问题可能听起来很熟悉,可能与其他问题类似 how to escape quotes in command argument to sh -c? 和许多其他人。但是,标记为回答这些问题的方法对我来说都不起作用。所以,请耐心等待。

我正在尝试向另一个终端发送命令。我已经知道我需要使用sh -c一次发送整个命令。命令本身是使用7z压缩文件。这是一个例子:

7z a Aa.zip Bb.txt

所以整个命令都是

sh -c '7z a Aa.zip Bb.txt'

这没有任何问题。问题是当要压缩的文件名中有单引号(')时,例如B'b.txt。所以,命令变为

sh -c '7z a Aa.zip B'b.txt'

不在终端中运行。

这些是我试过的没有运气的命令:

sh -c '7z a Aa.zip B'b.txt'
sh -c '7z a Aa.zip B\'b.txt'
sh -c '7z a Aa.zip B'"'"'b.txt'
sh -c '7z a Aa.zip "B'b.txt"'
sh -c '7z a Aa.zip \"B\'b.txt\"'
sh -c '7z a Aa.zip \"B'b.txt\"'
sh -c '7z a Aa.zip B'\''b.txt'

运行这些命令会导致此错误:

Syntax error: Unterminated quoted string

或等待输入

>

然后我使用Ctrl + c取消。

我也尝试使用变量,然后将其传递给sh -c。再没有运气:

cmd="'7z a Aa.zip B'b.txt'"
echo $cmd
'7z a Aa.zip B'b.txt'
sh -c $cmd
a: 1: a: Syntax error: Unterminated quoted string

请让我知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

您正在寻找:

sh -c '7z a Aa.zip "B'\''b.txt"'

这:'\''是一个转义'作为字符串的一部分。您需要sh命令本身。一旦你开始运行命令,让'无法匹配会导致问题,所以你需要将它放在一个字符串中。

答案 1 :(得分:0)

我建议您阅读这篇shell command language文章。 对于您的情况,特别是

“反斜杠不能用于转义单引号字符串中的单引号。嵌入引号可以通过编写来创建,例如:”'a'\''b'“,它产生”a“ b“。单个标记可以由包含所有三种引用或转义的连接部分字符串组成,因此允许任何字符组合。”

希望它对你有用。

答案 2 :(得分:0)

sh -c "7z a Aa.zip B'b.txt"

sh -c '7z a Aa.zip B'"'"'b.txt'

或者,你知道,使用(bash或zsh)数组。

cmd=(7z a Aa.zip B'b.txt)
sh -c "${cmd[@]}"