#!/bin/sh

LOOK_FOR="NTLMAuthenticationFilter"

for i in `find ./ -name "*jar"`
do
echo "Looking in $i ..."
grepjar -e $LOOK_FOR $i
done

Я написал сценарий выше, и попытался найти, существует ли какое-либо имя файла LOOK_FOR в этих jar-файлах. Мой квест: grepjar -e $ LOOK_FOR $ i, как я могу проверить, есть ли успешные результаты, и вывести их?

Кстати, что значит $? в сценарии оболочки? Спасибо !

2 ответа2

4

Попробуйте следующее изменение:

#!/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, изменен стиль цитирования переменных, включены предложения из комментариев и некоторые другие изменения стиля.

1

Вы должны быть в состоянии использовать $?.

В bash $? хранит возвращаемое значение команды. Вы можете проверить это значение после команды grepjar и вызвать echo $ i, если это то, что вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .