Linux 转义文件名的方式与Bash相同

Linux 转义文件名的方式与Bash相同,linux,bash,escaping,Linux,Bash,Escaping,当我在bash中使用“tab”键时(当您开始键入文件名并希望它完成时),bash会正确转义文件名,如果我使用的正是“转义”文件名,它就会工作 例如: a Beat-minalyinsine(原始混音)。mp3=>在bash之后使用“TAB”将其转义 a Beat\-\minaly\Insine\\(原创\Mix\).mp3 我正在为bash搜索一个函数,该函数将像“tab”转义文件名一样转义文件名。使用printf(1): $ string="An-Beat - Mentally Insine

当我在
bash
中使用“tab”键时(当您开始键入文件名并希望它完成时),
bash
会正确转义文件名,如果我使用的正是“转义”文件名,它就会工作

例如:

a Beat-minalyinsine(原始混音)。mp3
=>在
bash
之后使用“TAB”将其转义
a Beat\-\minaly\Insine\\(原创\Mix\).mp3

我正在为
bash
搜索一个函数,该函数将像“tab”转义文件名一样转义文件名。

使用
printf
(1):

$ string="An-Beat - Mentally Insine (Original Mix).mp3"
$ echo ${string// /\\ }
An-Beat\ -\ Mentally\ Insine\ (Original\ Mix).mp3
$ string=${string// /\\ }
$ echo ${string//(/\\( }
An-Beat - Mentally Insine \( Original Mix).mp3
会回来的

a\ real\ \\good\ %\*\ load\ of\ c\$rap

我将详细阐述sehe对这一点的回应

如果要传递要转换为shell脚本参数的参数,请将参数封装在“'s”中

我非常喜欢printf解决方案,因为它可以处理每个特殊字符,就像bash一样。

来自“sehe”的解决方案工作得很好,此外,您还可以使用双引号(“)而不是单撇号('),以便能够使用变量:

x="a real \good %* load of crap from ${USER}"
echo $(printf '%q' "$x")
当然,字符串可能不包含$或“本身”,或者您必须手动通过splash\$来避开这些字符

ls  --quoting-style=escape /somedir

这将输出转义的文件名,也可以使用unicode字符,printf方法不适用于中文,它会输出类似$'\206\305…'的内容。

我可能会晚一点参加聚会,但对我有效的是:

ls  --quoting-style=shell-escape

通过这种方式,它还可以逃避像
”这样的字符。

谢谢@Ignacio,我对这个问题的感觉要比我能说的好得多。:@Ignacio确实如此。这似乎与变量有关,在变量值中加引号也没有任何帮助——他需要它们围绕变量替换,还有一个wa如果x是shell脚本的一个参数,用户可以将x包含('),我必须将(')替换为(\')。有什么简单的方法来处理这种情况吗?@zsxwing它已经有了,只需从
x=“”
开始演示!(
printf“%q”“”
prints
\'
)%在Ubuntu15上printf的未知指令中。04@airboss呵呵。这就是“垃圾进垃圾出”。问题不是
printf
,而是您传递了无效的输入。只要使用
printf“%q”test$2 3.jpeg'
,就像你想在任何地方使用未展开的字符串文字一样()@airboss,如果你只是使用给定的答案代码(而不是在不理解的情况下更改它):这是一个注释,而不是细化,依我看
ls  --quoting-style=escape /somedir
ls  --quoting-style=shell-escape