Как передать подстановочные знаки оболочки в команду backtick

Я пытаюсь использовать 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 ответа

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

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

Редактировать:

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

myfind(){
    find . -iname "*DATA*.txt" | wc -l
}

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

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

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

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

Пытаться:

FINDCMD='find . -iname "*DATA*.txt"'
Другие вопросы по тегам