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