Использовать параметр в аргументе команды

Я запустил команду find для поиска файлов с именем, содержащим perl :

 find /tmp -name '*perl*' /tmp/perl.pl /tmp/run-perl-stage.pl 

Но когда я устанавливаю имя perl в переменной PARAMETER и снова запускаю команду find я не получаю никаких результатов! Как запустить команду find с помощью параметра $PARAMETER ?

 PARAMETER=perl find /tmp -name '*$PARAMETER*' 

не дает никаких результатов.

 find /tmp -name '*\$PARAMETER*' 

не дает никаких результатов.

Вам нужно использовать двойные кавычки, а не одинарные кавычки.

Внутри одинарных кавычек '…' каждый символ интерпретируется буквально. Единственный характер, который обрабатывается специально, это символ одиночной кавычки, который заканчивает буквенную строку.

Внутри двойных кавычек "…" специально обрабатываются следующие символы:

  • " (двойная кавычка) завершает цитированную строку.
  • $ (доллар). Он может начать замену переменных или подстановку команд или арифметическое выражение: "$PARAMETER" , "${PARAMETER}" , "${PARAMETER%/*}" , "$(somecommand)" , $((x+2)) и т. д.
  • ` (backquote) расширяется. Это альтернативная форма подстановки команд, которая сложна в использовании, когда у вас есть специальные символы в вложенной команде: `foo` – это как $(foo) но сложнее получить право в сложных случаях.
  • В интерактивных оболочках ! может вызвать расширение истории.
  • \ (обратная косая черта) цитирует следующий символ, но только если это один из символов в этом списке: с другими символами обратная косая черта остается. Например, "foo\$\bar" эквивалентно 'foo$\bar' . В качестве исключения последовательность обратной косой черты игнорируется: обратная косая черта возвращает следующий символ новой строки.

Следствием этого является то, что вы не можете иметь одну цитату внутри строки с одной кавычкой. Чтобы обойти это, вы можете объединить части: echo 'Here'\''sa string with a single quote' передает один аргумент для echo который выражается в трех частях, две строки с одной кавычкой с \' (расширяющиеся до одного одиночная кавычка) между ними.

Поскольку вы хотите заменить переменную, используйте двойные кавычки:

 find /tmp -name "*$PARAMETER*" 

Кстати, есть разница между "$PARAMETER" и « $PARAMETER . С двойными кавычками оболочка просматривает значение PARAMETER и расширяет эту строку в командной строке. Без кавычек значение PARAMETER интерпретируется как список шаблонов подстановок, разделенных пробелами. Это почти никогда не желательно, поэтому всегда ставьте двойные кавычки вокруг переменных и подстановок команд.

Во-первых, никогда не используйте переменную верхнего регистра в bash, она может противоречить существующим системным переменным.

Во-вторых, для вашей проблемы вы можете сделать это так (если вам по-прежнему нужна одиночная кавычка, а не двойные)

 param='*perl*' find /tmp/ -name $param