Назад | Перейти на главную страницу

Когда использовать одинарные и двойные кавычки в grep?

При поиске простого шаблона "hello" в файле все следующие формы grep работают:

Есть ли конкретный случай, когда одна из вышеперечисленных форм работает, а другие нет? Есть ли разница, если я использую одно вместо другого?

На самом деле это зависит от вашей оболочки. Цитаты (любого типа) в первую очередь предназначены для работы с пробелами. Например, следующее:

grep hello world file1

будет искать слово "hello" в файлах с именами "world" и "file1", а

grep "hello world" file1

будет искать "hello world" в file1.

Выбор между одинарными или двойными кавычками важен только в том случае, если строка поиска содержит переменные или другие элементы, которые, как вы ожидаете, будут оцениваться. В одинарных кавычках строка воспринимается буквально, и расширения не происходит. В двойных кавычках переменные раскрываются. Например (с оболочкой, производной от Борна, такой как Bash или ZSH):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

Первый grep будет искать буквальную строку «$ VAR1» в файле file1. Второй будет расширять переменную «$ VAR» и искать строку «serverfault» в файле file1.

Джеймс прав, но, чтобы добавить еще несколько данных, я думаю, что лучший способ думать об этом - это аргументы команды: вы хотите, чтобы «hello» и «world» были двумя аргументами или «hello world» были одним аргумент.

Кроме того, двойные кавычки позволяют интерпретировать не только переменные. Именно то, что зависит от вашей оболочки, но проверьте расширение истории, расширение скобок и расширение имени файла.

Также важно отметить, что в некоторых случаях вам нужно использовать оба типа кавычек в одном аргументе. Помните, что (по умолчанию) аргументы разделяются пробелами, поэтому, если вы не оставляете пробелов, вы все равно указываете тот же аргумент.

Механизм одинарных кавычек большинства оболочек не допускает использование каких-либо специальных символов, что означает, что любой экземпляр другой одиночной кавычки, даже если он кажется экранированным, завершает кавычку. Следовательно, невозможно передать строку с одинарной кавычкой внутри одиночной кавычки, и вы должны использовать двойные кавычки. Это может быть проблемой, когда вы хотите передать аргумент, содержащий одиночные кавычки и что-то, что может быть интерпретировано, но вы этого не хотите. Например, если вы хотите передать буквальную строку «'$ VAR' является переменной», вы должны сделать это следующим образом:

"'"'$VAR'"' is a variable"

На самом деле это конкатенация трех строк с экранированными кавычками:

"'"
'$VAR'
"' is a variable"

или с удаленными кавычками:

'
$VAR
' is a variable

На самом деле, с большинством оболочек это можно сделать и так:

"'\$VAR' is a variable"

где обратная косая черта ("\") указывает оболочке буквально принять следующий символ и не расширять его.

Но бывают случаи, когда вам приходится делать это методом конкатенации нескольких строк, не то чтобы я мог прямо сейчас привести пример.