Ответ 1
Он вызывает интерпретацию escape-последовательностей.
$ echo $'Name\tAge\nBob\t24\nMary\t36'
Name Age
Bob 24
Mary 36
(И SO обрабатывает вкладки в дурацкой манере, поэтому попробуйте сделать это дома)
Мне нужно передать строку в программу в качестве аргумента из 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.
Я действительно искал это, но не могу найти то, что мне нужно...
Он вызывает интерпретацию escape-последовательностей.
$ echo $'Name\tAge\nBob\t24\nMary\t36'
Name Age
Bob 24
Mary 36
(И SO обрабатывает вкладки в дурацкой манере, поэтому попробуйте сделать это дома)
Используя $
в качестве префикса, сообщите BASH, чтобы попытаться найти переменную с этим именем. $'
- это специальный синтаксис (полностью объясненный здесь), который позволяет обрабатывать строки ANSI-C. В этом случае одиночный тик не "принимает значение дословно до следующего одиночного тика". Он должен быть достаточно безопасным для использования. Недостатки - это BASH только и довольно необычный, поэтому многие люди будут задаваться вопросом, что это значит.
Лучше всего использовать одинарные кавычки. Если вам нужна одиночная кавычка в строке, вам нужно заменить ее на '\''
. Это заканчивает предыдущую одинарную кавычку, добавляет к ней одну кавычку (\'
), а затем запускает новую одиночную кавычку. Этот синтаксис работает с любым потомком оболочки Bourne, это довольно легко понять, и большинство людей быстро распознают шаблон.
Альтернативой является замена каждого отдельного тика на '"'"'
, который преобразуется в "завершение текущей одинарной кавычки, добавляет двойную кавычку, содержащую только один тик, перезапускает одиночную кавычку". Это избегает escape-символа и выглядит красиво симметричным. Он также работает наоборот, если вам нужна двойная кавычка в строке с двойными кавычками: "'"'"
.
Вы не найдете более быстрый или более эффективный способ, чем:
eval RESULT=\$\'$STRING\'
Во-первых, это та вещь, в которой есть eval, и вы избегаете сумасшедшей стоимости подпроцесса forking повсюду, о чем свидетельствуют предыдущие ответы. Ваш пример:
$ foo='\u25b6'
$ eval bar=\$\'$foo\'
$ echo "$bar"
▶