Что такое переменный атрибут?

Вот краткий ответ-

Ядро-самая внутренняя часть любой современной операционной системы, напрямую взаимодействующая с аппаратным обеспечением.

Оболочка-оболочка вокруг фактического ядра. Всякий раз, когда мы запускаем команду, мы на самом деле общаемся с оболочкой, которая, в свою очередь, вызывает соответствующие инструкции ядра. Помимо этого, оболочка способна выполнять некоторые другие действия, такие как поиск подходящей программы при наличии команд, сокращение имен некоторых файлов, конвейерные команды и т. д.

Терминал-В эпоху более ранних вычислений компьютеры (, известные как мейнфреймы ), были гигантскими. Таким образом, было легко иметь один процессор и подключать его из разных мест. Терминал — это аппаратное обеспечение с клавиатурой и устройствами вывода, подключенными к мейнфрейму.

Консоль-Терминал особого типа, напрямую подключенный к мейнфрейму для целей администрирования ОС.

tty-Телетайп, используемый для отправки и получения данных на мейнфрейм и обратно. Использовался до появления видеотерминалов. Но условно он по-прежнему называется tty. Даже командаstty

Длинный подробный ответ здесь-Терминал, Консоль, Оболочка, Ядро, Команды -Различные части компьютера

1
01.06.2019, 21:28
2 ответа

Обычно переменная — это место для хранения значения. Вы присваиваете значение переменной (var="some value"), а после этого можете вызвать значение с расширением переменной (запись "$var"эквивалентна записи"some value").

Можно создавать переменные, которые делают что-то особенное, когда вы присваиваете им значение или в других обстоятельствах, когда оболочка обращается к переменным. Атрибут переменной — это аннотация, которую оболочка хранит рядом с именем и значением переменной и указывает оболочке применить это особое поведение.

Один пример

declare -i xсообщает оболочке, что xдолжен содержать только целочисленные значения. Обычно, когда вы присваиваете значение переменной, оболочка берет строку, полученную в результате расширения правой -стороны знака равенства, и сохраняет ее как значение переменной. Но если переменная имеет целочисленный атрибут, оболочка анализирует эту строку как арифметическое выражение и сохраняет результат вычисления этого выражения. Например:

$ x=2+2; echo $x
2+2
$ declare -i x; x=2+2; echo $x
4
$ declare -i x; x=2+hello; echo $x
2
$ declare -i x; x=2+
bash: 2+: syntax error: operand expected (error token is "+")

(Третья строка с x=2+helloустанавливает для xзначение 2, поскольку hello— это имя переменной, которое не определено, а неустановленные переменные интерпретируются как 0 по умолчанию.)

Еще примеры

  • declare -l varобъявляет, что varдолжен содержать только строчные буквы. Когда оболочка сохраняет значение переменной, она преобразует любую прописную букву в строчную.
  • declare -u varвыполняет преобразование в другом направлении.
  • declare -r varделает varтолько для чтения -, что также является особым поведением присваивания :и приводит к сбою каждого последующего присваивания var.
  • declare -x varвызывает экспорт varв среду. Для этого атрибута особое поведение происходит, когда bash запускает внешнюю команду :внешние команды видят среду, содержащую переменные, которые оболочка экспортирует во время выполнения внешней команды.
8
27.01.2020, 23:11

Изhelp declare:

Options which set attributes:
    -a  to make NAMEs indexed arrays (if supported)
    -A  to make NAMEs associative arrays (if supported)
    -i  to make NAMEs have the `integer' attribute
    -l  to convert the value of each NAME to lower case on assignment
    -n  make NAME a reference to the variable named by its value
    -r  to make NAMEs readonly
    -t  to make NAMEs have the `trace' attribute
    -u  to convert the value of each NAME to upper case on assignment
    -x  to make NAMEs export

Примечание:declareтакже можно использовать для функций.

Каждый из этих атрибутов имеет одно или несколько применений:


-a-чтобы сделать индексированные массивы NAMEs (, если поддерживается)

В этом нет необходимости, поскольку установка параметра в виде массива автоматически объявит его как индексированный массив. Использование этого может сделать ваш код более очевидным и читаемым.


-A-для создания ассоциативных массивов NAME (, если поддерживается)

Насколько мне известно, это совершенно необходимо, так как попытка установить ассоциативный массив без предварительного объявления его как такового приведет к индексированному массиву.

$ assoc=([foo]=bar)
$ declare -p assoc
declare -a assoc=([0]="bar")
$ unset assoc
$ declare -A assoc
$ assoc=([foo]=bar)
$ declare -p assoc
declare -A assoc=([foo]="bar" )

-i-чтобы ИМЕНА имели целочисленный атрибут `

Полезно, если вы хотите, чтобы ваш параметр мог содержать только целые числа. Это также позволяет выполнять арифметическое расширение при присваивании.

$ declare -i a
$ a=foo
$ echo $a
0
$ a=1+1
$ echo $a
2

-l-для преобразования значения каждого NAME в нижний регистр при назначении

Гарантирует, что значения ваших параметров всегда будут в нижнем регистре. Это довольно крутая функция, о которой я не знал и, вероятно, буду использовать в будущем. Это устраняет необходимость расширения сложных параметров или использования отдельной утилиты, такой как tr

.
$ declare -l foo=Bar
$ echo $foo
bar

-n-сделать NAME ссылкой на переменную, названную по ее значению

Как косвенная ссылка. Это может исключить использование evalво многих скриптах.

$ a=foo
$ declare -n b=a
$ echo $b
foo

-r-сделать ИМЕНА доступными только для чтения

Это хорошая функция. Это может быть особенно полезно для переменных оболочки/среды, которые вы хотите установить один раз и убедиться, что они не изменились

$ declare -r foo=bar
$ echo $foo
bar
$ foo=baz
-bash: foo: readonly variable

-t-чтобы ИМЕНА имели атрибут `трассировки

Я не уверен насчет этого. Я думаю, что это может относиться только к функциям.


-u-для преобразования значения каждого NAME в верхний регистр при назначении

Аналогично -l, но противоположно

$ declare -u foo=bAr
$ echo $foo
BAR

-x-для экспорта ИМЕН

Еще один способ экспортировать переменные в среду.


6
27.01.2020, 23:11

Теги

Похожие вопросы