Як я можу зробити щось подібне в басі?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Як я можу зробити щось подібне в басі?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Відповіді:
Як умовно щось зробити, якщо команда вдалася чи не вдалася
Саме це і ifробить вислів Баша:
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
Додавання інформації з коментарів: у цьому випадку не потрібно використовувати синтаксис [... сама по собі команда, майже майже рівнозначна . Це, мабуть, найпоширеніша команда, яка використовується в , що може призвести до того, що вона є частиною синтаксису оболонки. Але якщо ви хочете перевірити, вдалася чи ні команда, використовуйте саму команду безпосередньо з , як показано вище.][testifif
Редагувати: Цитуйте питання вгорі для наочності (ця відповідь не відображається вгорі сторінки).
thenокремий рядок.
if ! command ; then ... ; fi. [сама по собі команда, і вона не потрібна в цьому випадку.
if [ ! command ]не виконується command; він трактує commandяк рядок і трактує його як істинне, оскільки має ненульову довжину. [є синонімом testкоманди
Для дрібних речей, які ви хочете статися, якщо працює команда оболонки, ви можете використовувати &&конструкцію:
rm -rf somedir && trace_output "Removed the directory"
Аналогічно для дрібних речей, які ви хочете статися, коли команда оболонки не працює, ви можете використовувати ||:
rm -rf somedir || exit_on_error "Failed to remove the directory"
Або і те й інше
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
Мабуть, нерозумно робити це з цими конструкціями, але вони можуть іноді зробити потік управління набагато чіткішим.
Перевірте значення $?, яке містить результат виконання останньої команди / функції:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
ifідіому Баша . Я вважаю за краще відповідь Кіта Томпсона.
ifє зробити це. Умови контролю потоку в Bash усі досліджують $?за кадром; ось що вони роблять. Явне вивчення його вартості має бути непотрібним у переважній більшості випадків і, як правило, є початківцем антипаттером.
if ! cmdце добре. В іншому випадку загальною умовою є використання elseпункту. Ви не можете мати порожнє, thenале іноді ви бачите, then : nothing; elseде :но-оп є важливим. trueпрацювали б і там.
Це працювало для мене:
command && echo "OK" || echo "NOK"
якщо це commandдосягає успіху, він echo "OK"виконується, і оскільки він успішний, виконання припиняється на цьому. В іншому випадку &&пропускається і echo "NOK"виконується.
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))?
echo "OK"частина може сама вийти з ладу, тоді це краще:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Слід зазначити, що if...then...fiта &&/ ||тип підходу стосується статусу виходу, повернутого командою, яку ми хочемо перевірити (0 на успіх); однак деякі команди не повертають ненульового статусу виходу, якщо команда не вдалася або не змогла мати справу з введенням. Це означає, що звичайні ifта &&/ ||підходи не працюватимуть для цих конкретних команд.
Наприклад, в Linux GNU fileвсе ще залишається з 0, якщо він отримав як аргумент неіснуючий файл і findне зміг знайти вказаного користувачем файлу.
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
У таких випадках одним із можливих способів вирішити ситуацію є читання stderr/ stdinповідомлення, наприклад, ті, що повернулися fileкомандою, або розбір результатів команди, як в find. Для цього caseможна використовувати оператор.
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
Найбільш схильна до помилок я могла прийти:
RR=$?
Тепер, не тільки для цієї ситуації, але й для інших, з якими ви можете зіткнутися, врахуйте:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Відповідь: так
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Відповідь: ні
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Відповідь: ні
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Відповідь: так
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Відповідь: так
Це запобігає помилкам від усіх видів.
Ви, напевно, знаєте про всі синтаксиси, але ось кілька порад:
"blank"бути nothing.${variable}.base-8. Ви отримаєте помилку типу:
value too great for base (error token is "08")для номерів вище 7. Це коли 10#вступає в гру:10#змушує число бути base-10.Ви можете зробити це:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
pingфіксований з огляду на запуск його як команди. Але тому, що висновок буде переспрямовано на / dev / null, це завжди буде порожнім рядком. Таким чином, ви нічого не запускаєте в підзарядку, що означає, що попередній статус виходу (підзаголовок підстановки команди, тобто ping) буде збережено. Очевидно, тут правильний шлях if ping ...; then.
Як зазначалося в іншому рядку, оригінальне запитання в основному відповідає самому собі. Ось ілюстрація, що показує, що ifумови можуть також вкладатись.
Цей приклад використовується ifдля перевірки наявності файлу та чи є звичайним файлом. Якщо ці умови істинні, перевірте, чи має його розмір більше 0.
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi
Це можна зробити просто таким чином, оскільки $?надає статус останньої виконаної команди.
Так могло бути
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi