Як дізнатися, чи знаходить команда будь-який результат?


0
#!/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 тут, як я можу перевірити, чи є якісь успішні результати, і вивести їх?

До речі, що означає $? в сценарії оболонки? Дякую !


для i in ... це відома пастка, ніколи не роблять цього. Подивитися mywiki.wooledge.org/BashPit
vtest

Відповіді:


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

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-скрипт, змінився стиль цитування змінної, включені пропозиції з коментарів і деякі інші зміни стилю.


-печать | Чи можете ви пояснити це під час читання i? і я виявив, що grepjar завжди відображає повідомлення про помилку, чи можу я змусити його не виводити жодного повідомлення про помилку?
Foolish

@Foolish: так ... cmd 2> /dev/null
akira

1
Нічого в /dev є пристроєм. /dev/null це спеціальний пристрій, який приймає і відкидає будь-який вхід.
Cry Havok

1
Якщо ви перевіряєте $? дорівнює нулю або не дорівнює нулю if тоді ви робите це неправильно. Просто поставте команду безпосередньо в if на першому місці.
Ignacio Vazquez-Abrams

1
@Cry: Змінити grepjar -e $LOOK_FOR $i до grepjar -e "$LOOK_FOR" "$i", і read i до read -r i, у випадку, якщо імена файлів містять спеціальні символи зворотної косої риси. Завжди подвійні заміни і пройти -r до read, якщо не знаєте чому ні .
Gilles

1

Ви повинні мати можливість використовувати $ ?.

У bash $? зберігає повернене значення команди. Ви можете перевірити це значення після команди grepjar і echo $ i, якщо це те, що ви шукаєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.