Как условно сделать что-то если команда, за которой следуют или неудавшийся

Использование:

git diff --color=always | less -r

--color=always есть ли для сообщения git к кодам цвета вывода, даже если вывод является каналом (не tty). И -r есть ли для сообщения less интерпретировать те цветовые коды и другие escape-последовательности. Использовать -R для цветовых кодов ANSI только.

315
17.10.2011, 02:57
7 ответов

Как условно сделать что-то если команда, за которой следуют или неудавшийся

Это точно что удар if оператор делает:

if command ; then
    echo "Command succeeded"
else
    echo "Command failed"
fi

Добавление информации из комментариев: Вы не должны использовать [ ... ] синтаксис в этом случае. [ самостоятельно команда, очень почти эквивалентная test. Это - вероятно, наиболее распространенная команда для использования в if, который может привести к предположению, что это - часть синтаксиса оболочки. Но если Вы хотите протестировать, ли команда, за которой следуют или нет, используйте саму команду непосредственно с if, как показано выше.

393
27.01.2020, 19:26
  • 1
    Обратите внимание, что точка с запятой важна. –  Thorbjørn Ravn Andersen 17.10.2011, 10:37
  • 2
    Или можно просто поместить then на отдельной строке. –  l0b0 17.10.2011, 12:00
  • 3
    @Joe: Я думаю, что Вы имеете в виду if ! command ; then ... ; fi. [ самостоятельно команда, и это не нужно в этом случае. режим –  Keith Thompson 13.01.2012, 12:19
  • 4
    @Joe: Мой путь также имеет достоинство того, чтобы быть корректным. if [ ! command ] не выполняется command; это рассматривает command как строка и обработки это как верный, потому что это имеет ненулевую длину. [ синоним для test команда –  Keith Thompson 14.01.2012, 11:36
  • 5
    Ой. Вы корректны. –  Joe 14.01.2012, 12:09

Для мелочей, что Вы хотите произойти, если команда оболочки работает, можно использовать && конструкция:

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"

Вероятно, неблагоразумно сделать очень много с этими конструкциями, но они могут при случае сделать поток из управления намного более ясным.

141
27.01.2020, 19:26
  • 1
    Они короче и (по крайней мере, в некоторых оболочках) быстрее. Я дрожу, помня сценарий установки монстра Ultrix, записанный только с этими условными конструкциями, которые я когда-то пытался дешифровать... –  vonbrand 28.12.2015, 00:15

Проверьте значение $?, который содержит результат выполнения новой команды/функции:

#!/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
108
27.01.2020, 19:26
  • 1
    В то время как технически исправляют (и таким образом не гарантирование downvote), оно не использует Bash if идиома. Я предпочитаю ответ Keith Thompson. –  janmoesen 17.10.2011, 14:30
  • 2
    Существуют преимущества для этой идиомы - она сохраняет возвращаемое значение. В целом, я нахожу, что этот более мощен, хотя более подробный. также легче читать. спасибо –  taxilian 08.10.2015, 00:16
  • 3
    Что такое "Bash если идиома"? –  Nowaker 27.06.2016, 04:37
  • 4
    @Nowaker то, что единственная цель if должен сделать это. Условия управления потоком в Bash все исследуют $? негласно; это - то, что они делают. Явно исследование его значения должно быть ненужным в подавляющем большинстве случаев и обычно является антишаблоном новичка. –  tripleee 04.11.2016, 14:34

Это работало на меня:

command && echo "OK" || echo "NOK"

если command успешно выполняется, затем echo "OK" выполняется, и так как это успешно, выполнение останавливается там. Иначе, && пропускается, и echo "NOK" выполняется.

50
27.01.2020, 19:26
  • 1
    , Если Вы хотите сделать что-то, если это перестало работать, и сохраните код выхода (для показа в командной строке или тесте в сценарии), можно сделать это: command && echo "OK" || c=$?; echo "NOK"; $(exit $c) –  Sam Hasler 24.06.2014, 18:57
  • 2
    @Sam-Hasler: не был должен это быть command && echo "OK" || (c=$?; echo "NOK"; (exit $c))? –  jrw32982 supports Monica 01.04.2015, 21:24
  • 3
    Кроме того, если echo "OK" часть могла самостоятельно перестать работать, затем это лучше: command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c)) –  jrw32982 supports Monica 01.04.2015, 21:34
  • 4
    @jrw32982, Хороший, я использовал бывшую конструкцию, но не последнего. –  Sam Hasler 02.04.2015, 19:11
  • 5
    Реальный ответ находится в комментариях, спасибо все! –  Joshua Pinter 24.10.2017, 23:13

Вы можете сделать это:

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
  echo "ping response succsess!!!"
fi
1
27.01.2020, 19:26

Это могло быть сделано просто таким образом как $? дает вам состояние последней выполняемой команды.

, Таким образом, это могло быть

#!/bin/sh

... some command ...

if [ $? == 0 ] ; then
  echo '<the output message you want to display>'
else 
  echo '<failure message>'
fi
-3
27.01.2020, 19:26

Как отмечалось в другом месте этой цепочки, исходный вопрос в основном отвечает сам собой. Вот иллюстрация, показывающая, что условия 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
1
27.01.2020, 19:26

Теги

Похожие вопросы