Как можно предотвратить скрипт bash, продолжающий ошибку при использовании eval или подстановки команды [duplicate]

Firebase 4.0.1

       Database.database().reference().child("key").observe(.value) { snapshot in
            if let datas = snapshot.children.allObjects as? [DataSnapshot] {
                let results = datas.flatMap({
                  ($0.value as! [String: Any])["xxx"]
                }
                print(results)
            }
       }

Если у вас несколько ключей / значений и вы хотите return array с dictionary элементами, объявите массив:

var yourArray = [[String: Any]]()

, затем смените тело блока на это:

     let children = snapshot.children
     while let rest = children.nextObject() as? DataSnapshot, let value = rest.value {
          self.yourArray.append(value as! [String: Any])
      }
9
задан petersohn 25 March 2014 в 11:31
поделиться

3 ответа

До bash 4 появляется set -e только для выхода из командной строки, если простая команда имеет ненулевой выход (выделение мое):

-e Выйти немедленно если простая команда (см. SHELL GRAMMAR выше) выходит с ненулевым статусом.

В bash 4 (возможно, 4.1 у меня нет проверки 4.0), эффект -e был расширен до более сложных команд:

-e Немедленно выйти, если конвейер (который может состоять из одной простой команды), команда подголовника, заключенная в круглые скобки, или одна из команд, выполненных как часть списка команд, заключенного в фигурные скобки (см. выше), выходит с ненулевым статусом.

8
ответ дан chepner 3 September 2018 в 16:44
поделиться

Как и в случае с Bash 4.4, все эти команды возвращают 1:

( set -e; ( false; true ) )
( set -e; ( true; false ); true )
( set -e; ( set -e; false; true ); true )

Поэтому я думаю, что вы можете использовать более старую версию Bash, которая имеет разные реализации в отношении команд set -e и подселей, как указал другой ответ .

0
ответ дан Cyker 3 September 2018 в 16:44
поделиться

Из man bash:

set [+ abefhkmnptuvxBCEHPT] [+ o option-name] [arg ...]

-e

Выйти немедленно, если конвейер (который может состоять из одной простой команды), команда подголовника, заключенная в круглые скобки, или одна из команд, выполняемых как часть списка команд, заключенного в фигурные скобки (см. SHELL GRAMMAR выше), выходит с -zero статус. Оболочка не выходит, если неудавшаяся команда является частью списка команд сразу после некоторого времени или до тех пор, пока ключевое слово, часть теста, следующего за зарезервированными словами if или elif, не будет частью любой команды, выполненной в & amp; & amp; & amp; или || список, за исключением команды, следующей за окончательным & amp; & amp; или ||, любая команда в конвейере, но последняя, ​​или если возвращаемое значение команды инвертируется с помощью!. Ловушка ERR, если установлена, выполняется до выхода оболочки. Этот параметр применим к среде оболочки и каждой среде субголома отдельно (см. Выше ОБЩИЕ УСЛОВИЯ ОКРУЖАЮЩЕЙ СРЕДЫ) и может вызывать подоболочки для выхода до выполнения всех команд в подоболочке.

Итак, когда false, он выходит из подоболочки.

См. несколько примеров:

# when `false`, exit. Hence, no `echo ho`
$ ( set -e; echo hi; false; echo ho ) ; echo $?
hi
1

# when `false`, exit. Hence, no `echo hu`
$ ( set -e; echo hi; true; echo ho; false; echo hu ) ; echo $?
hi
ho
1
3
ответ дан fedorqui 3 September 2018 в 16:44
поделиться