Переменные


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

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