Linux: команда set для локальных переменных

9

Я пытаюсь понять локальные переменные / переменные окружения и команды экспорта / установки.

$ set FILEM="razrax"
$ echo $FILEM

$ FILEN="test"
$ echo $FILEN
test

Пожалуйста, объясните, почему echo $FILEMвозвращает пустую строку

iJava
источник

Ответы:

21

Вы путаете bashс csh.

В , bashкак и в любом Bourne-подобные оболочкам, setэто команда набора опций (параметры конфигурации оболочки нравятся -f, -C, -o noclobber...) и позиционные параметры ( $1, $2...).

set FILEM="razrax"

Устанавливается $1в FILEM=razrax.

$ set FILEM="razrax"
$ echo "$1"
FILEM=razrax

Синтаксис для назначения переменных в Bourne-подобных оболочках:

VAR=value

(не допускается места по обе стороны =).

kshи некоторые другие Bourne-подобные оболочки (mksh, pdksh, zsh) также могут назначать переменные массива с помощью set:

set -A array value1 value2

zsh, bash, yashИ новые версии kshиспользовать этот синтаксис вместо этого:

array=(value1 value2)

Напротив, в cshили tcsh, синтаксис:

set VAR = value
set array = (value1 value2)

(пробелы вокруг =необязательно).

В rc/ esоболочки:

VAR = value
array = (value1 value2)

(пробелы вокруг =необязательно).

Стефан Шазелас
источник
Спасибо за хороший ответ. Единственное, что я не понимаю, в чем разница между параметрами и локальными переменными «set - команда для установки параметров»?
iJava
@iJava, set -Cустанавливает -Cпараметр (так же, как set -o noclobber). set fooназначает fooк $1$#равно 1, ( $2, $3убираются если установлено ранее)). Проверьте руководство вашей оболочки для деталей.
Стефан Шазелас
1
Я не понимаю, какие есть варианты. Являются ли эти опции, которые отправляются в программы, как main (String [] args)? Или что? Где они используются?
iJava
1
@iJava, это настройки, которые влияют на поведение оболочки. Опять RTFM
Стефан Шазелас