Спробуйте виконати наведені нижче дії.
#!/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