Предотвратите расширение параметра в сценарии оболочки

Я часто должен делать рекурсивный поиск в файлах. Усталый от ввода целой "find/grep" комбинации все время, я просто создал сценарий со следующей строкой:

find . -name $1 -exec grep $2 {} + 2>/dev/null

Идея состоит в том, что я должен смочь выполнить его как, например:

myfind '*' hello

Проблема, когда '*' передается в сценарий, сценарий разворачивает его до каждого файла в каталоге.

Я пытался поместить кавычку вокруг $1:

 find . -name '$1' -exec grep $2 {} + 2>/dev/null

Однако это поворачивается $1 в литеральную строку.

Ценил бы Вашу справку в нахождении правильного синтаксиса. Должно быть что-то простое, которое я пропускаю.

8
задан 12 March 2016 в 11:26

2 ответа

Я продемонстрировал проблему здесь:

$ pie() { echo $1; }; pie '*'
1 2 3 4 5 file

Расширенный. Беспокойство.

, Но решение довольно просто. Просто необходимо заключить его в кавычки, но способом что удар поймет. Мы используем двойные кавычки. Это будет заменено переменным содержанием, но это не будет расширено.

$ pie() { echo "$1"; }; pie '*'
*
11
ответ дан 23 November 2019 в 05:29

Необходимо ознакомиться с основными правилами относительно расширения оболочки переменных.

NAME="start"

при представлении $NAME оболочке, это будет exanded к строке , запускаются

, Если Вы помещаете одинарные кавычки вокруг строки, оболочка не разворачивает то, что в одинарных кавычках, таким образом, '$NAME' остается как $NAME

Теперь с двойными кавычками, оболочка расширяется, переменные $NAME к строке запускаются , но двойные кавычки предотвращают то, что известно как файл globbing.

, Что такое файл globbing Вы, спрашивают?

Хорошо это Вы делаете

ls -l *

, Вы ожидаете, что команда ls перечислит все файлы. Это не ls, который преобразовывает * во все имена файлов в каталоге, но оболочку.

Теперь говорят, что у Вас был файл, названный * в Вашем каталоге, и Вы просто хотели перечислить тот файл, тогда Вы могли использовать или

ls -l '*' 

или

ls -l "*"

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

Globbing может также быть выключен путем выполнения

set noglob

Вместо того, чтобы иметь эту простую строку поиска как отдельный сценарий оболочки, требующий, чтобы новая оболочка была вызвана каждый раз, когда он используется, более эффективный путь состоит в том, чтобы создать, как фс функции оболочки (find_string)

function fs ()
{
 \find . -type f -name "${1}" -exec egrep --color "${2}" {} /dev/null \;
}
4
ответ дан 23 November 2019 в 05:29

Другие вопросы по тегам:

Похожие вопросы: