Подтвердить что ты не робот

Как главный знак доллара влияет на одинарные кавычки в Bash?

Мне нужно передать строку в программу в качестве аргумента из Bash CLI, например

program "don't do this"

Строка может содержать любой символ типа '$', '\' и т.д., и я не хочу, чтобы Bash выполнял какие-либо изменения. Поэтому я думаю об использовании одинарных кавычек.

Однако следующее не работает:

 program 'don\'t do this'            //escape doesn't work in single quote

В то время как следующие две работы:

 program $'dont\'t do this'          //seems fine, but any other side effects?
 program 'dont'\''do this'           //breaking into 3 parts

Первый подход кажется лучше в том, что он получает меньше предварительной модификации (поставьте символ доллара впереди и замените каждый \ на \\), но я не знаю, что еще может сделать DOLLAR SIGN.

Я действительно искал это, но не могу найти то, что мне нужно...

4b9b3361

Ответ 1

Он вызывает интерпретацию escape-последовательностей.

$ echo $'Name\tAge\nBob\t24\nMary\t36'
Name    Age
Bob     24
Mary    36

(И SO обрабатывает вкладки в дурацкой манере, поэтому попробуйте сделать это дома)

Ответ 2

Используя $ в качестве префикса, сообщите BASH, чтобы попытаться найти переменную с этим именем. $' - это специальный синтаксис (полностью объясненный здесь), который позволяет обрабатывать строки ANSI-C. В этом случае одиночный тик не "принимает значение дословно до следующего одиночного тика". Он должен быть достаточно безопасным для использования. Недостатки - это BASH только и довольно необычный, поэтому многие люди будут задаваться вопросом, что это значит.

Лучше всего использовать одинарные кавычки. Если вам нужна одиночная кавычка в строке, вам нужно заменить ее на '\''. Это заканчивает предыдущую одинарную кавычку, добавляет к ней одну кавычку (\'), а затем запускает новую одиночную кавычку. Этот синтаксис работает с любым потомком оболочки Bourne, это довольно легко понять, и большинство людей быстро распознают шаблон.

Альтернативой является замена каждого отдельного тика на '"'"', который преобразуется в "завершение текущей одинарной кавычки, добавляет двойную кавычку, содержащую только один тик, перезапускает одиночную кавычку". Это избегает escape-символа и выглядит красиво симметричным. Он также работает наоборот, если вам нужна двойная кавычка в строке с двойными кавычками: "'"'".

Ответ 3

Вы не найдете более быстрый или более эффективный способ, чем:

eval RESULT=\$\'$STRING\'

Во-первых, это та вещь, в которой есть eval, и вы избегаете сумасшедшей стоимости подпроцесса forking повсюду, о чем свидетельствуют предыдущие ответы. Ваш пример:

$ foo='\u25b6'
$ eval bar=\$\'$foo\'
$ echo "$bar"
▶