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=$_設定されます)。afoo_

答え2

あなたの質問の核心は、課題とは何かということです。man bash明らかにそれを定義していませんが、POSIX仕様にはそれに関する言葉がある:

4.23 変数の割り当て

シェル コマンド言語では、次の部分で構成される単語です。

変数名=値

シェルに組み込まれた手段によって特殊パラメータ$@と を変更することはできますが、実際にそれらに代入を書き込むことはできません。 と書くことは、それほど訓練されていない目にも$*非常に不自然に見えるため、賢明に選択されたと私は思います。*=string

関連情報