Как передать подстановочные знаки оболочки в команду 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
}
И ОБА из следующего:
- Используйте кавычки в команде поиска:
FINDCMD="find . -iname \"*DATA*.txt\""
ИЛИ ЖЕFINDCMD='find . -iname "*DATA*.txt"'
- Используйте следующую опцию bash:
-f Disable pathname expansion.
следующееset -f
в начале сценария
Это должно делать свое дело. Не проверено на вашем сценарии, но вы должны понять с этого момента.
Переключите одинарные и двойные кавычки.
Пытаться:
FINDCMD='find . -iname "*DATA*.txt"'