Проблема не связана с одинарными кавычками. (Я предполагаю, что вы имеете в виду одинарные кавычки, отображаемые в выводе ошибки;это просто способ отображения ошибки )в Python, а тот факт, что вы полагаетесь на то, что оболочка разбивает $text
на отдельные слова по пробелам. В то же время вы удалили символ пробела из переменной IFS
перед циклом, что означает, что оболочка не будет корректно выполнять такое разбиение.
Правильным решением будет не заставить оболочку разбивать $text
на пробелы, так как это все равно вызовет подстановку имен файлов в сгенерированных словах. Поскольку $text
содержит $1
, $2
и $3
, эти значения также будут разделены на пробелы и т. д. при разделении $text
.
Вместо того, чтобы полагаться на то, что оболочка правильно разделит переменную $text
, прочитайте два слова в каждой строке samp.txt
в цикле while
:
while read -r script config; do
out=$( python "$script" "$config" -c "$1" -s "$2" -t "$3" )
done <samp.txt
Если вы хотите использовать отдельную переменную для ваших аргументов, и если вы используете, например. bash
или другая оболочка с именованными массивами:
args=( -c "$1" -s "$2" -t "$3" )
while read -r script config; do
out=$( python "$script" "$config" "${args[@]}" )
done <samp.txt
Использование массива для аргументов вместо текстовой строки позволяет правильно разграничить аргумент внутри массива. Расширение "${args[@]}"
будет состоять из отдельных элементов этого массива с правильно заключенными в кавычки каждым элементом. Это означает, что, например. $1
, $2
и $3
могут без проблем содержать пробелы и т. д.
В скрипте POSIX(/bin/sh
)при условии, что вы можете безопасно отказаться от позиционных параметров, начиная с $4
и далее:
set -- -c "$1" -s "$2" -t "$3"
while read -r script config; do
out=$( python "$script" "$config" "$@" )
done <samp.txt
ПРИМЕЧАНИЕ :Здесь я использовал БЕЛЫЙ цвет (0xffffff ), вы можете использовать любой цвет, просто введите шестнадцатеричный код этого цвета. Например, :0xff0000 для КРАСНОГО, 0x00ff00 для ЗЕЛЕНОГО и т. д.