В POSIX shell есть переменные.

Простая работа с переменными

Использование кавычек для записи всего выражения:

v="3 python -c 'import os; print(os.environ[\"v\"])'"

Обращение к переменной (разыменование):

echo $v

Как ни странно, уже на этом этапе могут начаться проблемы.

Во-первых, переменную нужно установить правильно.

Хорошему программисту в этом месте скорее всего захочется поставить пробелы вокруг оператора присваивания. Интенция замечательная, но в случае с shell неприменимая.

Например,

v= abc

это создание пустой переменной v перед вызовом команды abc,

а вот это:

v =abc

вызов команды v с аргументом =abc, аналогично:

v = abc

вызов v с аргументами = и abc.

В отличие от

v=abc

что является присваиванием строки abc в переменую v.


Во-вторых, нужно правильно обрабатывать пробелы, см. секцию про это ниже.

Переменные с пробелами

Раскрытие переменных с пробелами:

x="echo   5"

можно раскрыть так (да, это исполняемая команда!):

$x
## вывод
5

Выясните чем отличаются раскрытия без кавычек:

python -c 'import sys; print(sys.argv)' $x

И с кавычками:

x="echo   5"
python -c 'import sys; print(sys.argv)' "$x" '$x'

Переменные окружения и переменные в shell

Было бы довольно странно, если бы переменные в shell никак не были связаны с переменными окружения.

Экспорт переменных

Для передачи значения переменной в другие (дочерние) программы:

export my_var

или, если хочется также установить значение

export my_var=3

Если имя совпадает с существующей переменной окружения, export не требуется.

Можно также передать переменную окружения при запуске команды:

my_var=3 python -c 'import os; print(os.environ["my_var"])'

что, как можно догадаться, аналогично:

export my_var=3
python -c 'import os; print(os.environ["my_var"])'