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

У меня есть, чтобы найти список слов в списке файлов. Поэтому я поместил список слов в файл и с помощью цикла 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

The find command find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null works perfectly in the command prompt, whereas it is not at giving any output, if used in the shell script as mentioned above.

Вывод 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 .

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

0
de

2 ответы

$PATH is important variable with meaning. You should choose another name.

In this case find executable cannot be found because $PATH doesn't lead to it. You are not notified because of 2>/dev/null.

echo is probably a shell builtin, it needs no $PATH to work. The same for for etc.

4
добавлено
Хорошо. Теперь я изменил PATH на PATHS, даже тогда он не работает. Я получаю ниже выход. /NO/20171013/655044810645 734729751028 find/NO/20171013/-type f -name "* .txt" -exec grep -w '655044810645' {} \; 2>/dev/null |/usr/bin/wc -l 0 LINES 0 find/NO/20171013/-type f -name "* .txt" -exec grep -w '734729751028' {} \; 2>/dev/null |/usr/bin/wc -l 0 LINES 0
добавлено автор Karl, источник
@steeldriver Эти backticks могут быть правы. С помощью cat они присваивают переменной STAT44.txt .
добавлено автор Kim, источник
@KamilMaciorowski, если вы правы, - помните, что не отправляйте до кофе;)
добавлено автор steeldriver, источник

First, set up a proper $PATH (and see answer by Kamil Maciorowski):

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

echo PATH=$PATH

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

OR you can add a full path to find command. If you don't know where find are placed, execute:

which find

Output will be like this: /usr/bin/find

And you have a mistake inside loop:

Вам нужно заменить одиночные кавычки на двойные (около $ {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. You do not need cat file, try to use loop instead. But use only while, not for! Read Why you don't read lines with "for" and How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?
2
добавлено
@Egor Vasilyev OKay Я понимаю использование для и пока. Но команда find не возвращает никакого вывода. Я даже сменил одиночные кавычки на двойные кавычки, даже тогда находка не возвращает никакого вывода.
добавлено автор Karl, источник
@EgorVasilyev Я редактировал свой вопрос с выводами и изменениями в скрипте. Пожалуйста, изучите его.
добавлено автор Karl, источник
@EgorVasilyev YEah. В конце концов. Это сработало. Спасибо за это.
добавлено автор Karl, источник
+1 Потому что вы покрываете проблемы, которые мой ответ не делает (я решил не дублировать их).
добавлено автор Kim, источник
@sabarish jackson, можете ли вы обновить свой ответ с помощью последнего кода сценария?
добавлено автор Egor Vasilyev, источник
@sabarish jackson, $ PATH - встроенная переменная оболочки. Вам нужно использовать другое имя переменной, например $ PATH_TO_FOLDER или что-то еще. См. Ответ от Kamil Maciorowski
добавлено автор Egor Vasilyev, источник