Когда вы представляете строковый литерал (в сценарии или при передаче аргументов в сценарий), вы должны использовать действительную оболочку представление этой строки, а не только необработанную строку. Например, предположим, что вы хотите передать / использовать эту строку:
12 34 kla#42@!' 2 M$" rtqas;::#
Существует несколько способов , представляющих эту строку для использования в сценарии оболочки или командной строке. Вы можете оставить его без кавычек, но экранировать отдельные специальные символы, например:
12\ 34\ kla\#42@\!\'\ 2\ M\$\"\ rtqas\;::\#
Или вы можете заключить его в двойные кавычки и экранировать только те символы, которые имеют особое значение внутри двойных кавычек (то есть двойные кавычки, обратные кавычки и знаки доллара, а также, если это интерактивные восклицательные знаки в bash) :
"12 34 kla#42@!' 2 M\$\" rtqas;::#" # For a non-interactive shell
"12 34 kla#42@\!' 2 M\$\" rtqas;::#" # For an interactive shell
Если в нем нет одинарных кавычек, вы можете его заключить в одинарные кавычки; поскольку это так, вы не можете использовать этот метод. Но вы можете смешивать методы, например, использование одинарных кавычек вокруг частей, которые не содержат одинарных кавычек, и экранирование или двойные кавычки в одинарных кавычках:
'12 34 kla#42@!'\'' 2 M$" rtqas;::#' # Single-quote is escaped
'12 34 kla#42@!'"'"' 2 M$" rtqas;::#' # Single-quote is double-quoted
В bash (но не в некоторых других оболочках) есть также экранированные ANSI-C строки, записанные с $' ... '
:
$'12 34 kla#42@!\' 2 M$" rtqas;::#' # Single-quote is the only character that needs escaping
Обратите внимание, что все вышеперечисленное - это просто разные способы представления одной и той же строки; после того, как оболочка проанализирует его, он получит то же самое от любого из них. Вы можете использовать все, что вам удобно, но вы должны использовать синтаксически правильное представление строки.
Как только строка сохраняется в параметре / переменной, вы должны помещать двойные кавычки вокруг ссылок на эту переменную. В большинстве контекстов оболочки, когда переменная используется без кавычек, оболочка разделяет ее на слова (на основе пробелов или чего-либо еще в IFS
) и пытается раскрыть все, что похоже на подстановочный знак файла; ты не хочешь этого. Но если она заключена в двойные кавычки, переменная раскрывается и дальнейший разбор не выполняется , она просто передается через unmoled.
На самом деле, вы почти всегда должны заключать в кавычки переменные ссылки в кавычках, даже если вы не ожидаете, что они будут содержать специальные символы. Мы видим так много вопросов оболочки, на которые есть ответ: «Если вы дважды заключите в кавычки переменные, у вас не возникнет этой проблемы» ...