Ответ 1
Используйте printf
(1):
x='a real \good %* load of c$rap'
x=$(printf '%q' "$x")
echo $x
вернет
a\ real\ \\good\ %\*\ load\ of\ c\$rap
Когда я использую ключ "tab" в bash
(когда вы начали вводить имя файла, и вы хотите его завершить), bash
правильно экранирует имя файла и если я использую именно это "экранированное" имя файла, он работает.
Для экземпляра:
An-Beat - Mentally Insine (Original Mix).mp3
= > После bash
Сбрасывает его с помощью "TAB"
An-Beat\ -\ Mentally\ Insine\ \(Original\ Mix\).mp3
Я ищу функцию для bash
, которая позволит избежать имени файла так же, как "вкладка" пропускает имена файлов.
Спасибо заранее.
Используйте printf
(1):
x='a real \good %* load of c$rap'
x=$(printf '%q' "$x")
echo $x
вернет
a\ real\ \\good\ %\*\ load\ of\ c\$rap
Я собираюсь подробно рассказать об этом.
Если вы хотите передать аргумент, который будет преобразован в качестве параметра оболочки script, установите параметр в ".s".
#!/bin/bash
x=$(printf '%q' "$1")
echo $x
Мне очень нравится решение printf, так как оно имеет особый характер, как и bash.
$ 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
Решение от "sehe" отлично работает, кроме того, вы можете использовать двойные кавычки (") вместо одиночного апострофа ('), чтобы использовать переменные:
x="a real \good %* load of crap from ${USER}"
echo $(printf '%q' "$x")
Конечно, строка может не содержать $или "себя", или вы должны избегать этих manulally путем splash\$.