Як я можу зробити щось подібне в басі?
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
Додавання інформації з коментарів: у цьому випадку не потрібно використовувати синтаксис [
... сама по собі команда, майже майже рівнозначна . Це, мабуть, найпоширеніша команда, яка використовується в , що може призвести до того, що вона є частиною синтаксису оболонки. Але якщо ви хочете перевірити, вдалася чи ні команда, використовуйте саму команду безпосередньо з , як показано вище.]
[
test
if
if
Редагувати: Цитуйте питання вгорі для наочності (ця відповідь не відображається вгорі сторінки).
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