В 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"])'