Переменные
Простая работа с переменными
В POSIX shell есть переменные.
Создать переменную:
v="1 2 3 4"
Обращение к переменной (разыменование):
echo $v
Простая работа с переменными
Как ни странно, уже на этом этапе могут начаться проблемы.
Хорошему программисту в этом месте скорее всего захочется поставить пробелы вокруг оператора присваивания. Интенция замечательная, но в случае с b
ashнеприменимая.
Например,
v= abc
это создание пустой переменной v
перед вызовом команды abc
,
а вот это:
v =abc
вызов команды v
с аргументом =abc
, аналогично:
v = abc
вызов v
с аргументами =
и abc
.
Простая работа с переменными
В отличие от
v=abc
что является присваиванием строки abc
в переменую v
.
Но и это не всё, если нам нужно установить строку с пробелами, то мы опять будем испытывать сложности:
v=abc efg
как и с аргументами, можно использовать кавычки ''
и ""
:
v='abc efg'
Переменные с пробелами
Раскрытие переменных с пробелами:
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"])'