Попробуйте следующее изменение:
#!/bin/bash
LOOK_FOR="NTLMAuthenticationFilter"
find ./ -name "*.jar" -print | while read -r FILE
do
echo "Looking in ${FILE} ..."
grepjar -e "${LOOK_FOR}" "${FILE}" 2>/dev/null >/dev/null
RETCODE=${?}
if [ ${RETCODE} -eq 0 ]; then
echo "Found ${LOOK_FOR} in ${FILE}"
fi
done
?
переменная хранит возвращаемое значение последней команды. Обычно это будет 0
для успеха и любое другое значение для неудачи.
Вы также заметите, что я включил команду for
команду while
. Это позволяет получить больший набор возвращаемых результатов.
Разбить эту find ./ -name "*.jar" -print | while read -r FILE
:
find ./
- начиная с текущего каталога ...
-name "*.jar"
- найти файлы, заканчивающиеся на .jar
...
-print
- и напечатать их имена
|
- перенаправить этот вывод в следующую команду while read -r FILE
- и, пока есть вывод из предыдущей команды, назначить его переменной FILE
и выполнить команды между do
и done
.
Другими словами, он принимает выходные данные команды find (список файлов, оканчивающихся на jar
) и запускает блок кода в цикле. Для краткого списка он ведет себя точно так же, как ваша версия, использующая цикл for i in
. Преимущество состоит в том, что он поддерживает длинные списки, поскольку существует верхний предел того, что вы можете передать в командной строке, как вы делали с циклом for i in
.
Изменить: Изменен скрипт bash, изменен стиль цитирования переменных, включены предложения из комментариев и некоторые другие изменения стиля.