Intereting Posts
Как отключить системный звуковой сигнал для непривилегированного пользователя zsh / Prezto: трудности с правильным выравниванием Могу ли я загрузить источник ядра Knoppix в github? Используйте сетевой адаптер виртуальных машин в качестве сетевого адаптера по умолчанию Как использовать Wayland в Fedora? apt-get не удалось найти обновления для сжатия Debian Настройка Linux-ПК как маршрутизатора Как я могу использовать netconsole для решения проблемы паники ядра? Bash test wc с ошибкой '-ge' – деление на 0 Можно ли использовать сервер ламп для обслуживания файлов с nas? Как я могу автоматически обновлять макет монитора в XFCE? Возможно ли передавать файлы в диапазоне дат через FTP Почему пользователь без полномочий root не может войти с ключом в шпатлевку? Использование двойных или без кавычек с подстановочными знаками Изменение переменных группы и сохранения окружающей среды

Найти команду, которая не работает в сценарии оболочки

У меня есть, чтобы найти список слов в списке файлов. Поэтому я поместил список слов в файл и использовал for цикла, пытаясь прочитать каждое слово в файле и использовать команду find для grep для этого слова в списке найденных файлов.

Я использую упомянутый вкус Linux

 bash-3.1$ uname HP-UX 

Ниже приведен мой сценарий оболочки.

  #!/bin/sh PATH="/NO/20171013" STRING=`/usr/bin/cat /home/test/STAT44_test.txt` for LINE in ${STRING} do echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l" LINES=`find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l` echo "LINES count is ${LINES}" if [ ${LINES} -eq 0 ] then echo "In not found" # echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out else echo "In Found" # echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out fi done 

Команда find find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null отлично работает в командной строке, тогда как он не дает никакого вывода, если он используется в сценарии оболочки, как указано выше.

Вывод echo $? 0, но команда find не выводит никакого вывода.

Вывод скрипта

 find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l LINES count is 0 In not found find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l LINES count is 0 In not found 

На самом деле файлы *.txt под /NO/20171013 имеют файлы с рисунком 655044810645 и 734729751028 . Следовательно, Word count не должно быть 0, и оно должно попасть в else часть.

Что может быть пропало?

Сначала создайте правильную $PATH (и посмотрите ответ Камила Макоровского ):

Войдите в систему с подходящим пользователем (root?) И выполните:

 echo PATH=$PATH 

Добавьте вывод в начало скрипта

ИЛИ вы можете добавить полный путь для find команды. Если вы не знаете, где find , выполните:

 which find 

Результат будет таким: /usr/bin/find

И у вас есть ошибка внутри цикла :

Вам нужно заменить одиночные кавычки на двойные (около ${LINE} ), иначе переменная не будет интерпретироваться:

 echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l" LINES=`find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l` 

Некоторые примечания:

  1. Вам не нужен cat file , попробуйте использовать цикл. Но используйте только while , а не for ! Чтение Почему вы не читаете строки с «за» и как я могу читать файл (поток данных, переменную) по очереди (и / или поле за полем)?

$PATH – важная переменная со значением . Вы должны выбрать другое имя.

В этом случае find исполняемый файл невозможно, потому что $PATH не приводит к нему. Вы не уведомлены из-за 2>/dev/null .

echo , вероятно, является встроенной оболочкой, для работы не требуется $PATH . То же самое for и т. Д.