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
(帶選項)來修改$-
,運行命令來設置$?
, ETC。
作為例外,您實際上可以分配給_
,儘管它通常不會粘住(_=foo a=$_
設置a
為foo
和_
空字串)。
答案2
您問題的核心在於任務是什麼。man bash
顯然沒有定義它,但是POSIX 規範中有一個詞:
4.23 變數賦值
shell命令語言中的一個單字由以下部分組成:
變數名=值
您可以透過某些 shell 內建方法修改特殊參數,但實際上無法為它們編寫$@
賦值。我想說,它們的選擇是明智的,因為即使對於沒有受過如此訓練的眼睛來說,$*
寫作確實看起來非常不自然。*=string