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

M.A*_*A.G 18 linux bash escaping

当我使用"tab"键时bash(当你开始输入文件名并希望它完成时),bash正确地转义文件名,如果我使用那个"转义"文件名,它就可以了.

例如:

An-Beat - Mentally Insine (Original Mix).mp3=> bash使用"TAB"逃脱 之后An-Beat\ -\ Mentally\ Insine\ \(Original\ Mix\).mp3

我正在搜索一个函数bash,它将以"tab"转义文件名的方式转义文件名.

seh*_*ehe 26

使用printf(1):

x='a real \good %* load of c$rap'
x=$(printf '%q' "$x")
echo $x
Run Code Online (Sandbox Code Playgroud)

将返回

a\ real\ \\good\ %\*\ load\ of\ c\$rap
Run Code Online (Sandbox Code Playgroud)

  • @airboss 嗯。这就是“垃圾进垃圾出”。问题不在于 `printf`,而是你传递了无效的输入。只需使用 `printf '%q' 'test $2 3.jpeg'` 就像在任何需要未扩展字符串文字的地方一样 ([man bash](http://linux.die.net/man/1/bash)) (2认同)
  • @airboss 另外,如果您只是使用给定的答案代码(而不是在不理解的情况下更改它):http://ideone.com/HdtYoJ (2认同)

bva*_*ner 5

我将详细说明sehe对此问题的回应.

如果要传递要转换为shell脚本参数的参数,请将参数包含在"s"中.

#!/bin/bash
x=$(printf '%q' "$1")
echo $x
Run Code Online (Sandbox Code Playgroud)

我非常喜欢printf解决方案,因为它可以像bash一样完成每一个特殊的角色.

  • 这是评论,不是详细说明,IMO (2认同)

kur*_*umi 4

$ 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
Run Code Online (Sandbox Code Playgroud)