![Почему на странице руководства bash написано, что на специальные параметры «можно только ссылаться; присваивание им не допускается»?](https://rvso.com/image/170652/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D0%BD%D0%B0%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B5%20%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B0%20bash%20%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BE%2C%20%D1%87%D1%82%D0%BE%20%D0%BD%D0%B0%20%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B%20%C2%AB%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D1%81%D1%81%D1%8B%D0%BB%D0%B0%D1%82%D1%8C%D1%81%D1%8F%3B%20%D0%BF%D1%80%D0%B8%D1%81%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%D0%BC%20%D0%BD%D0%B5%20%D0%B4%D0%BE%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%D1%81%D1%8F%C2%BB%3F.png)
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
, даже для не очень тренированных глаз.