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