Спробуйте виконати наведені нижче дії.
#!/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
The ? змінна зберігає повернене значення останньої команди. Зазвичай це буде 0 для успіху та будь-якого іншого значення для невдачі.
Ви також помітите, що я перекинувся for команду в a 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-скрипт, змінився стиль цитування змінної, включені пропозиції з коментарів і деякі інші зміни стилю.
...це відома пастка, ніколи не роблять цього. Подивитися mywiki.wooledge.org/BashPit