Полностью спутан с обработкой цитат - PullRequest
0 голосов
/ 10 февраля 2019

Я схожу с ума, пытаясь выяснить, как правильно передавать аргументы из сценария оболочки в python, когда речь идет о обратных галочках.

Это мое ./foo.sh

#!/bin/bash
EXEC_SCRIPT="./foo.py -c  $1"
result=`${EXEC_SCRIPT}`
echo ${result}

Этомой ./foo.py

#!/usr/bin/python
import argparse

ap = argparse.ArgumentParser()
ap.add_argument('-c',  required=True)

args,u = ap.parse_known_args()
args = vars(args)

print ("I GOT {}".format(args['c']))

Я делаю:

./foo.sh ABC

и получаю:

I GOT ABC

Отлично.

Но тогда яdo:

./foo.sh "Hello World"

И я получаю:

I GOT Hello

Попытка изменить скрипт bash на:

EXEC_SCRIPT="./foo.py -c  \"$1\""

Производит:

I GOT "Hello

Ничего из этого не является проблемой, если я не использую обратные ссылки.Экранированные кавычки работают отлично.

Чего мне не хватает?

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

Дополнительные разъяснения: Спасибо Гордону и AK47 за то, что они сделали то же самое предложение.Похоже, причина в том, что я вставляю команду в переменную EXEC_SCRIPT.Вызов команды непосредственно внутри backticks работает.Мой настоящий сценарий более сложный и EXEC_SCRIPT указывает на разные значения из-за разных условий.Какой хороший способ получить чистый код, который позволяет мне найти правильную команду и затем вызвать ее в конце?Использование переменной логично, как и я, но, видимо, она не работает

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Я хочу поблагодарить другого парня и @Gordon Davisson за пояснение к предложению.

Изменение foo.sh для выполнения массива вместо строки, например:

#!/bin/bash
EXEC_SCRIPT=(./foo.py -c "$1")
result=$("${EXEC_SCRIPT[@]}")
echo ${result}

Прекрасно работает !!

0 голосов
/ 10 февраля 2019

foo.sh

#!/bin/bash
result=`./foo.py -c "$1"`
echo ${result}

foo.py

#!/usr/bin/python
import argparse
ap = argparse.ArgumentParser()
ap.add_argument('-c',  required=True)
args,u = ap.parse_known_args()
args = vars(args)
print ("I GOT {}".format(args['c']))

Тестирование:

MacBook-Pro:~ ak$ sh foo.sh "Hello World"
I GOT Hello World
...