一个命令被拆分为一个名为arguments的字符串数组。参数0通常是命令名称,参数1是命令后面的第一个元素,依此类推。这些参数有时称为位置参数。
$ ls -la /tmp /var/tmp
arg0 = ls
arg1 = -la
arg2 = /tmp
arg3 = /var/tmp
选项是一种已记录1的参数类型,用于修改命令的行为,例如,-l
通常表示“长”,-v
表示详细信息。 -lv
是将两个选项组合成一个单一参数。还有一些长选项 ,例如--verbose
(请参见使用getopts处理长短命令行选项)。如其名称所示,选项通常是可选的。然而,也有一些带有自相矛盾的“强制选项”的命令。
$ ls -la /tmp /var/tmp
option1= -l
option2= -a
参数是提供信息给命令或其中一个选项的参数,例如在-o file
中,file是-o
选项的参数。与选项不同,选项的可能值在程序中是硬编码的,而通常情况下参数不是,因此用户可以使用任何适合自己需求的字符串。如果您需要传递一个看起来像选项但不应被解释为选项的参数,则可以在命令行的开头用双破折号分隔它:--
2。
$ ls -la /tmp /var/tmp
parameter1= /tmp
parameter2= /var/tmp
$ ls -l -- -a
option1 = -l
parameter1 = -a
Shell参数 是指在shell上下文中存储一个值的任何东西,包括位置参数(例如 $1
, $2
...),变量(例如 $foo
, $bar
...)和特殊字符参数(例如 $@
)。
最后,还有子命令,也称为函数或者(低级)命令,它们与“元命令”一起使用,可以嵌入多个独立的命令,例如 busybox
、git
、apt-get
、openssl
等。对于它们,您可能会在子命令之前有全局选项,并在子命令之后有特定于该子命令的选项。与参数不同,可能的子命令列表是硬编码在命令本身中的。
$ busybox ls -l
command = busybox
subcommand = ls
subcommand option1 = -l
$ git --git-dir=a.git --work-tree=b -C c status -s
command = git
command option1 = --git-dir=a.git
command option2 = --work-tree=b
command option3 = -C c
subcommand = status
subcommand option1 = -s
注意,一些命令(如test
、tar
、dd
和find
)的参数解析语法比先前描述的更为复杂,并且它们的某些或所有参数可以被解析为 expressions
、operands
、keys
或类似的特定于命令的组件。$ ls -I README -l foo 'bar car' baz
有七个参数:/usr/bin/ls
、-I
、README
、-l
、foo
、bar car
和baz
,可以通过$0
到$6
访问。其中-l
和-I
被解释为选项,后者有一个参数(或值)为README
。剩下的是位置参数(foo
、bar car
和baz
)。
选项解析可能会通过移除已经使用的选项(例如使用shift
或set
)来更改参数列表,因此只剩下位置参数,并且可以通过$1
..$n
后续访问。
命令后面的所有内容都是参数。
简单的shell命令(如
echo a b c
)由命令本身和由空格分隔的参数组成。简单命令是最常遇到的命令类型。它只是一系列由空格分隔的单词,以 shell 的控制运算符之一结束(请参阅定义)。第一个单词通常指定要执行的命令,剩余的单词是该命令的参数。
在函数执行期间,参数称为参数。
当执行函数时,函数的参数在其执行期间成为位置参数
参数是存储值的实体。它可以是名称、数字或下面列出的特殊字符之一。变量是由名称表示的参数。
位置参数是由一个或多个数字表示的参数,除了单个数字 0。当调用 shell 时,位置参数从 shell 的参数中分配,并可以使用 set 内置命令重新分配。位置参数 N 可以被引用为 ${N},或者当 N 由一个数字组成时可以被引用为 $N。
没有专门的部分定义选项是什么,但它们在整个手册中被称为带连字符前缀的字符。
-p选项将输出格式更改为符合POSIX规范的格式。
execv
的系统调用时,可以通过将文字argv
数组作为参数传递到程序的执行时间来传递参数,而完全不涉及 Shell。 - Charles Duffy