#!/bin/sh
LOOK_FOR="NTLMAuthenticationFilter"
for i in `find ./ -name "*jar"`
do
echo "Looking in $i ..."
grepjar -e $LOOK_FOR $i
done
Я записал сценарий выше, и попытка найти, издает ли там какое-либо имя файла, LOOK_FOR существуют в тех, неприятный звук, мои поиски: grepjar-e $LOOK_FOR$i здесь, как я могу проверить, существует ли какой-либо успешный результат, и производит их?
между прочим, что является средним из $? в сценарии оболочки? Спасибо!
Попробуйте следующее изменение:
#!/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
команда в a while
команда. Это допускает больший набор возвращенных результатов.
Разрушение этого find ./ -name "*.jar" -print | while read -r FILE
команда:
find ./
- запуск в текущем каталоге...
-name "*.jar"
- найдите файлы, заканчивающиеся в .jar
...
-print
- и распечатайте их имена
|
- перенаправление, которые производят к следующей команде while read -r FILE
- и в то время как там производится от предыдущей команды, присвойте ее переменной FILE
и выполненный команды между do
и done
.
Другими словами, это берет вывод команды находки (список файлов, заканчивающихся в jar
) и выполняет блок кода в цикле. Для короткого списка это ведет себя точно как Ваша версия с помощью for i in
цикл. Преимущество состоит в том, что это поддерживает длинные списки, так как существует верхний предел тому, что можно передать командную строку, как Вы делали с for i in
цикл.
Править: Измененный на сценарий удара, измененный стиль заключения в кавычки переменной, включал предложения из комментариев и некоторых других изменений стиля.