Python анализ аргумента из bash переменной - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь передать переменную bash для анализа сценарием python следующим образом:

#!/bin/bash

command="--var1 var1 --var2 'var 2'"
echo $command
python test.py $command

python script (test.py)

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("--var1", action="store", dest="var1")
parser.add_argument("--var2", action="store", dest="var2")

args = parser.parse_args()
print args.var1, args.var2

Однако это не удается из-за пробелов, и я не знаю, как их избежать error: unrecognized arguments: 2'. Однако запуск python test.py --var1 var1 --var2 'var 2' из командной строки работает нормально. Есть ли способ обойти это?

Ответы [ 2 ]

5 голосов
/ 03 августа 2020

Используйте массивы для хранения строк из нескольких слов. Обычные строковые переменные страдают от неизбежных пробелов и проблем с кавычками, тогда как массивы обрабатывают их без проблем.

command=(--var1 var1 --var2 'var 2')
echo "${command[@]}"
python test.py "${command[@]}"

"${command[@]}" - это синтаксис для расширения массива с сохранением каждого элемента как отдельного слова. Обязательно используйте кавычки; не упускайте их.

1 голос
/ 03 августа 2020

Когда вы используете расширение без кавычек, bash расширяет его, включая любые расширения глобусов или другие вещи, найденные внутри. Он также уничтожает любые пробелы. Вот почему использование кавычек очень рекомендуется .

Другими словами, к тому времени, когда аргументы дойдут до python, они уже разделены на слова и не могут быть возвращены вместе.

Если вам нужно поместить в имя набор аргументов, рассмотрите возможность использования массива, например

command=('--var1' 'var1' '--var2' 'var 2')

и расширения, например

python test.py "${command[@]}"

Использование массив, bash будет учитывать настройку аргументов так же, как это было в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...