4

Ниже приведен однострочник Python, который я хочу запустить как часть моего скрипта bash.

python -c "from xml.dom.minidom import parse;dom = parse('/path/to/pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"

(pom.xml - XML-файл POM maven)

Я хочу, чтобы результат команды был назначен переменной MVN_VER

Это мой базовый скрипт:

WS="/path/to"
PY_GET_MVN_VERS="from xml.dom.minidom import parse;dom = parse(\'${WS}/pom.xml\')\;print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == \'version\']"

funcion test_mvn {

        MVN_VER=`python -c \"${PY_GET_MVN_VERS}\"`
        echo ${MVN_VERS}
}

test_mvn

Однако он не запускается. Если я запускаю скрипт с опцией +x, это то, что я вижу:

++ python -c '"from' xml.dom.minidom import 'parse;dom' = 'parse(\'\''/path/to/pom.xml\'\'')\;print' '[n.firstChild.data' for n in 'dom.childNodes[0].childNodes' if n.firstChild and n.tagName == '\'\''version\'\'']"'
  File "<string>", line 1
    "from

Я думаю, что это как-то связано с выходом из кода Python. Как я могу избежать этого правильно?

1 ответ1

6

Нет необходимости экранировать или перемещать аргумент в свою собственную переменную.

Но, сохраняя это в основном то же самое, у меня работает следующее:

#!/usr/bin/env bash
WS="/Users/danielbeck/Desktop"
PY_GET_MVN_VERS="from xml.dom.minidom import parse;dom = parse('${WS}/pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"
function test_mvn {
        MVN_VER=$( python -c "${PY_GET_MVN_VERS}" )
        echo ${MVN_VER}
}
test_mvn

/Users/danielbeck/Desktop/pom.xml - это пример минимального POM из документов Maven:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

Выход:

[u'1']

Пожалуйста, выбросьте свой код и просто используйте мой (после настройки WS) вместо того, чтобы настраивать свой, пока он не заработает. У вас там довольно много синтаксических ошибок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .