2017-01-20 5 views
1

У меня есть скрипт bash, который получает данные от json. Я хотел бы делегировать json-синтаксический анализ на python и управлять другими вещами с помощью bash. Так что я попытался следующие, и она работала:Python one-liner with if block

$cat json.txt | python -c "import sys, json; app_data=json.load(sys.stdin); print app_data['item'][0]['id'];" 

я решил проверить размер списка:

$cat json.txt | python -c 'import sys, json; app_data=json.load(sys.stdin); if len(app_data['item'])==1: print '1 item:'; print app_data['item'][0]['id']' 

Это не удалось с SyntaxError: недопустимый синтаксис.

Проверка размера списка (код выше) работает из отдельного файла .py в целом. Я бы предпочел использовать один-лайнер, чтобы он был прост и хранился вместе в сценарии оболочки.

Можно ли запускать python one-liner с некоторой логикой (например, import json) и if block?

ответ

3

Вопросы, относящиеся к этому вопросу Ответы на подобные вопросы уже заданы: Executing Python multi-line statements in the one-line command-line. Короче говоря, с помощью смешно $'' цитировании (который интерпретирует побеги как \n) должен работать, по крайней мере, в Баш:

$ cat json.txt 
{"item": [{"id": 1}]} 

$ cat json.txt | python -c $'import sys, json;\nd=json.load(sys.stdin)\nif len(d["item"])==1: print("""1 item:\n%s""" % d["item"][0]["id"])' 
1 item: 
1 

С синтаксической POV, проблема заключается в том, что Python позволяет использовать ; только в качестве разделителя так simple_stmt. Но if_stmt не является простым утверждением. См. https://docs.python.org/2/reference/simple_stmts.html#grammar-token-simple_stmt.