Оказалось, что это вызвано использованием Python semanti c пробелами. Python ветераны, вероятно, знали это сразу, но я только баловался, так что это сбивало с толку. Я объясню.
После долгих поисков я натолкнулся на мысль, что, возможно, проблема заключалась в отступе. Другие люди получали синтаксические ошибки, вызванные проблемами с отступами.
Python использует отступ вместо видимых символов для определения границ блока кода semanti c (например, тела al oop ). На C -подобном языке (где мне удобнее всего - Java, C# и т. Д. c), мы используем фигурные скобки для этого:
for (var i in myArray) {
i.doSomething();
printSomething(i);
}
Нет пробелов важно, поэтому легко превратить его в однострочник (хотя это не распространенная практика в C языках стиля:
for (var i in myArray) { i.doSomething(); printSomething(i); }
Итак, следующее, что я попробовал, это взять больше заботы о пробелах после моих точек с запятой. Моя для l oop была "отступом" на один пробел, тогда как строки import
и json.load
не имели начальных пробелов. Поэтому я удалил это пробел (я оставляю некоторые окружающего кода для краткости):
python -c "import json,sys;data=json.load(sys.stdin);for a in data['array']: print(a['id'])"
Это не помогло. Моя следующая мысль состояла в том, что, возможно, точки с запятой недостаточно, и что мне нужны были реальные разрывы строк. Я немного перебрал и остановился на этом, который работает:
MY_JSON=$(command that returns JSON containing an array of IDs)
IDS=$(echo "${MY_JSON}" | python -c "import json,sys;data=json.load(sys.stdin);
for a in data['array']:
print(a['server_id'])")
И оператор for
, и тело l oop должны находиться на отдельных отдельных строках, причем тело имеет более глубокий отступ, чем for
. Обратите внимание, что этот фрагмент * Скрипт 1039 * попадает в тело if
, поэтому все Я с отступом. В своих экспериментах я не смог найти устройство, которое работало бы там, где сам for
l oop начинался где угодно, но не в самом начале строки.
Конечный результат не очень красивый, но он работает .