Abort bash script, если git pull failed [duplicate]

Предположим, что у вас есть JSON, подобный этому

[
    {
        "type": "qrcode",
        "symbol": [
            {
                "seq": 0,
                "data": "HelloWorld9887725216",
                "error": null
            }
        ]
    }
]

Чтобы разобрать вышеупомянутый JSON в единстве, вы можете создать такую ​​модель JSON.

[System.Serializable]
public class QrCodeResult
{
    public QRCodeData[] result;
}

[System.Serializable]
public class Symbol
{
    public int seq;
    public string data;
    public string error;
}

[System.Serializable]
public class QRCodeData
{
    public string type;
    public Symbol[] symbol;
}

И затем просто проанализировать следующим образом ...

var myObject = JsonUtility.FromJson("{\"result\":" + jsonString.ToString() + "}");

Теперь вы можете изменить JSON / CODE в соответствии с вашими потребностями. https://docs.unity3d.com/Manual/JSONSerialization.html

339
задан Mat 16 September 2012 в 12:01
поделиться

9 ответов

Добавьте это в начало скрипта:

set -e

Это приведет к немедленному завершению работы оболочки, если простая команда выходит с ненулевым значением выхода. Простой командой является любая команда, не являющаяся частью if, while или до теста или частью & amp; & amp; или || list.

Для получения дополнительной информации см. справочную страницу bash (1) для внутренней команды.

Я лично запускаю почти все сценарии оболочки с помощью "set -e". Это очень раздражает, когда сценарий упрямо продолжается, когда что-то терпит неудачу в середине и ломает предположения для остальной части скрипта.

597
ответ дан Palmstrom 21 August 2018 в 06:04
поделиться
  • 1
    Это сработает, но мне нравится использовать & quot; #! / Usr / bin / env bash & quot; потому что я часто запускаю bash из другого места, кроме / bin. И & quot; #! / Usr / bin / env bash -e & quot; не работает. Кроме того, приятно иметь место для изменения, чтобы читать «set -xe». когда я хочу включить трассировку для отладки. – Ville Laurikari 4 May 2009 в 20:25
  • 2
    Имейте в виду, что этого может быть недостаточно из-за трубопроводов. См. Мой добавленный ответ. – leonbloy 3 December 2010 в 15:23
  • 3
    Кроме того, флаги в строке shebang игнорируются, если сценарий запускается как bash script.sh. – Tom Anderson 3 December 2010 в 15:26
  • 4
    Просто примечание. Если вы объявляете функции внутри сценария bash, для расширения этой функции функции должны быть установлены -e, обновленные внутри тела функции. – Jin Kim 19 October 2012 в 18:40
  • 5
    Кроме того, если вы используете свой сценарий, строка shebang будет неактуальной. – Smith John 14 April 2013 в 17:17

Запустите его с помощью -e или set -e вверху.

Также посмотрите set -u.

13
ответ дан fedorqui 21 August 2018 в 06:04
поделиться
  • 1
    Чтобы потенциально спасти других, необходимо прочитать help set: -u рассматривает ссылки на неустановленные переменные как ошибки. – mklement0 16 April 2013 в 05:31
  • 2
    так что это либо set -u, либо set -e, а не оба? @lumpynose – ericn 1 June 2016 в 07:46
  • 3
    @eric Я вышел на пенсию несколько лет назад. Несмотря на то, что я любил свою работу, мой старый мозг забыл обо всем. Небрежно, я бы предположил, что вы можете использовать их вместе; плохая формулировка с моей стороны; Я должен был сказать «и / или». – lumpynose 1 June 2016 в 17:37

Если у вас есть очистка, которую вы должны сделать при выходе, вы также можете использовать «ловушку» с ERR псевдосигнала. Это работает так же, как захват INT или любого другого сигнала; bash выбрасывает ERR, если какая-либо команда выходит с ненулевым значением:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

Или, особенно если вы используете «set -e», вы можете заблокировать EXIT; тогда ваша ловушка будет выполнена, когда сценарий выйдет по какой-либо причине, включая нормальный конец, прерывания, выход, вызванный параметром -e и т. д.

26
ответ дан fholo 21 August 2018 в 06:04
поделиться

просто бросает в другой для ссылки, так как есть дополнительный вопрос для ввода Mark Edgars, и вот еще один пример и касается общей темы:

[[ `cmd` ]] && echo success_else_silence

, которая совпадает с cmd || exit errcode, как показал кто-то.

, например. Я хочу убедиться, что раздел отключен, если установлен:

[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1 
-2
ответ дан Frédéric Hamidi 21 August 2018 в 06:04
поделиться
  • 1
    Нет, [[ cmd`]] `не то же самое. Это неверно, если вывод команды пуст и истинен в противном случае, независимо от состояния выхода команды. – Gilles 22 September 2012 в 23:42
#!/bin/bash -e

должно быть достаточно.

3
ответ дан Frits 21 August 2018 в 06:04
поделиться

Выражение, подобное

dosomething1 && dosomething2 && dosomething3

, прекратит обработку, когда одна из команд вернется с ненулевым значением. Например, следующая команда никогда не будет печатать «done»:

cat nosuchfile && echo "done"
echo $?
1
3
ответ дан gabor 21 August 2018 в 06:04
поделиться

Переменная $? редко требуется. Псевдо-идиома command; if [ $? -eq 0 ]; then X; fi всегда должна быть записана как if command; then X; fi.

Случаи, когда требуется $?, необходимо проверить на несколько значений:

command
case $? in
  (0) X;;
  (1) Y;;
  (2) Z;;
esac

или когда $? необходимо повторно использовать или иным образом манипулировать:

if command; then
  echo "command successful" >&2
else
  ret=$?
  echo "command failed with exit code $ret" >&2
  exit $ret
fi
10
ответ дан Mark Edgar 21 August 2018 в 06:04
поделиться
  • 1
    Почему «всегда следует писать как»? Я имею в виду, почему « должен » & quot; это так? Когда команда длинная (подумайте, что вы используете GCC с дюжиной опций), тогда гораздо лучше прочитать команду перед проверкой статуса возврата. – ysap 8 September 2012 в 13:50
  • 2
    Если команда слишком длинная, вы можете ее разбить, указав ее (определите функцию оболочки). – Mark Edgar 11 November 2012 в 01:27
  • 3
    Спасибо, именно то, что я искал ... – Hako 20 May 2018 в 09:50

Чтобы добавить к принятому ответу:

Помните, что иногда set -e недостаточно, особенно если у вас есть трубы.

Например, предположим, что у вас есть этот скрипт

#!/bin/bash
set -e 
./configure  > configure.log
make

... который работает так, как ожидалось: ошибка в configure прерывает выполнение.

Завтра вы делаете кажущееся тривиальное изменение:

#!/bin/bash
set -e 
./configure  | tee configure.log
make

... и теперь это не работает. Это объясняется здесь здесь , и предусмотрено обходное решение (только Bash):

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make
159
ответ дан ndmeiri 21 August 2018 в 06:04
поделиться
  • 1
    Спасибо, что объяснили важность того, чтобы pipefail согласился с set -o! – Malcolm 26 April 2018 в 16:48

Операторы if в вашем примере не нужны. Просто сделайте это так:

dosomething1 || exit 1

Если вы берете совет Ville Laurikari и используете set -e, то для некоторых команд вам может понадобиться использовать это:

dosomething || true

Кнопка || true приведет к тому, что конвейер команды получит возвращаемое значение true, даже если команда не будет выполнена, поэтому опция -e не будет убивать скрипт.

70
ответ дан Zan Lynx 21 August 2018 в 06:04
поделиться
  • 1
    Мне это нравится. Тем более, что главный ответ - bash-centric (совсем не понятно мне, будет ли / в какой степени это относится к zsh-скриптам). И я мог бы это посмотреть, но вы просто понятнее, потому что логика. – g33kz0r 19 May 2015 в 15:09