Как передать подстановочные знаки оболочки в команду backtick - PullRequest
3 голосов
/ 01 апреля 2011

Я пытаюсь использовать find в сценарии оболочки для подсчета количества файлов, которые у меня совпадают с шаблоном подстановки, а затем для получения имени файла, если есть только один.Но у меня возникают проблемы при передаче шаблона с подстановочными знаками в расширение backtick.

FINDCMD="find . -iname *DATA*.txt"
DATACOUNT=$($FINDCMD | wc -l)

if [ $DATACOUNT -eq 1 ]
then
  use-data $($FINDCMD)
else
  echo bugger
fi

Это не работает: оболочка расширяет DATA .txt во время вызова find.Я хочу, чтобы звёздочки были пропущены, чтобы найти.

Если я сделаю это

FINDCMD="find . -iname '*DATA*.txt'"

Тогда оболочка не расширит звёздочки, но find получит одинарные кавычки и ничего не совпадет.

Ответы [ 3 ]

1 голос
/ 01 августа 2011

И ОБА из следующих:

  1. Используйте кавычки в команде поиска: FINDCMD="find . -iname \"*DATA*.txt\"" ИЛИ FINDCMD='find . -iname "*DATA*.txt"'
  2. Используйте следующую опцию bash: -f Disable pathname expansion. следующим образом set -f в начале скрипта

Это должно сработать. Не проверено на вашем сценарии, но вы должны понять с этого момента.

1 голос
/ 01 апреля 2011

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

DATACOUNT=$(find . -iname "*DATA*.txt" | wc -l)
if [ $DATACOUNT -eq 1 ];then
    .....
fi

Edit:

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

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}
0 голосов
/ 04 апреля 2011

Переключение одинарных и двойных кавычек.

Попробуйте:

FINDCMD='find . -iname "*DATA*.txt"'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...