Почему на странице руководства bash написано, что на специальные параметры «можно только ссылаться; присваивание им не допускается»?

Почему на странице руководства bash написано, что на специальные параметры «можно только ссылаться; присваивание им не допускается»?

man bashчитает:

Special Parameters
       The shell treats several parameters specially.
       These parameters may only be referenced; assignment to them is not allowed.

Ну, shiftизменяет и то @, и *другое (точно так же, конечно). И set -- one two threeфактически присваивает то, что я хочу, @и то, что я хочу *.

Значит, я неправильно понимаю то, что manнаписано на страницах?

решение1

Вы не можете назначать специальные параметры. Вы не можете использовать оператор присваивания ( 1=foo, @=(foo bar), ?=0, …). Вы не можете использовать конструкцию расширения параметра присваивания ( ${1=foo}, …).

Конечно, вы можете изменить их, но вам придется использовать косвенный метод, отличный от присваивания, например set(с аргументами без опций) или shiftвстроенные функции для установки позиционных параметров и $#, set(с опциями) для изменения $-, запуск команды для установки $?и т. д.

В качестве исключения вы можете фактически присвоить значение _, хотя обычно это не сохраняется ( _=foo a=$_устанавливает aзначение fooи _значение на пустую строку).

решение2

Суть вашего вопроса заключается в том, что такое задание. man bashпо-видимому, не определяет его, ноВ спецификации POSIX есть пара слов об этом:

4.23 Присвоение переменных

В языке команд оболочки слово, состоящее из следующих частей:

имя_переменной=значение

Вы можете изменять специальные параметры $@и $*некоторые встроенные средства оболочки, но вы не можете фактически написать назначение для них. Они были выбраны мудро, я бы сказал, потому что это действительно выглядело бы очень неестественно *=string, даже для не очень тренированных глаз.

Связанный контент