术语之间的区别:“选项”,“参数”和“参数”?


70

这些术语之间的区别是:“选项”,“参数”和“参数”?在手册页中,这些术语通常看起来可以互换使用。


这些术语在任何方面都不是特定于Shell的:参数可以在程序执行时以字面量argv数组的形式传递,该字面量作为execv-style syscall的参数给出,而根本不涉及任何shell。
查尔斯·达菲

Answers:


126

命令被分成称为字符串数组参数。参数0(通常)是命令名称,参数1是命令后的第一个元素,依此类推。这些参数有时称为位置参数

$ ls -la /tmp /var/tmp
arg0 = ls
arg1 = -la
arg2 = /tmp
arg3 = /var/tmp

一个选项是一个记录类型参数修改的行为命令,例如,-l通常的意思是“长”,-v冗长。-lv是在单个参数中组合的两个选项。也有类似的长选项(另请参见使用getopts处理长和短命令行选项)。顾名思义,选项通常是可选的。但是,有些命令带有矛盾的“强制性选项”。--verbose

$ ls -la /tmp /var/tmp
option1= -l
option2= -a

参数是要么所述提供信息的参数命令或它的一个选项,例如在-o file文件是的参数-o选项。与选项(可能的值在程序中用硬编码)不同,参数通常不是参数,因此用户可以自由使用适合其需要的任何字符串。如果您需要传递看起来像选项的参数,但不应这样解释,则可以将其与命令行的开头用双破折号分隔:--

$ ls -la /tmp /var/tmp
parameter1= /tmp
parameter2= /var/tmp

$ ls -l -- -a
option1    = -l
parameter1 = -a

一个shell参数是任何存储在外壳的背景值。这包括位置参数(例如$1$2...),变量(例如$foo$bar...)和特殊字符(例如$@

最后,还有,也被称为功能/(低电平)的命令,这是与该嵌入多个单独的命令,如“元命令”使用busyboxgitapt-getopenssl,和喜欢。有了它们,您可能在子命令之前有全局选项,并且在子命令之后有特定于子命令的选项。与参数不同,可能的子命令列表在命令本身中是硬编码的。例如:

$ 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
subcommand         = status
subcommand option1 = -s

请注意,某些命令喜欢testtardd并且find具有比那些先前所描述的,可以有部分或全部它们的参数解析为更复杂的参数解析语法expressionsoperandskeys和类似命令的具体内容。

还请注意,尽管由外壳程序处理了代字号扩展,参数扩展,命令替换,算术扩展和引号删除等可选变量分配和重定向,但与其他命令行参数一样,这些变量也未考虑在内,因为当该命令实际上是被调用并传递其参数的。


@jlliagre“硬编码变量”也称为参数吗?例如,文件的某些路径,您不作为参数传递,而是使用VARNAME="VALUE"语法在bash脚本中创建。如果不是(即VARNAME不是参数),那么为什么参数扩展的概念也适用于硬编码变量?
user1534664

1
@ user1534664我将这些可选的变量分配留在了答复范围之外,因为执行的命令未将它们视为参数。我出于相同的原因也没有考虑重定向,但是从外壳解释器的角度来看,您正确的是,对这些赋值进行了预处理,以进行波浪号扩展,参数扩展,命令替换,算术扩展和引用删除等其他参数。
jlliagre

@jlliagre您上面提供的定义是否有参考?当我在bash手册中查找这些术语时,其定义与您的定义略有不同。但是,该手册未具体提及长选项之类的概念,因此也许有更好的参考?
joelostblom

@joelostblom答案已通过一些链接进行了更新,其中包括一些关于短/长选项的参考。
jlliagre

10

man一个典型的Unix命令页面经常使用的术语argumentoptionparameter。在最低级别上,我们拥有的argument所有东西都是一个参数,包括(文件系统的路径)命令本身。

在一个shell脚本您使用的特殊变量访问参数$0.. $n。其他语言也有类似的访问方式(通常通过名称为的数组argv)。

如果愿意,可以将参数解释为选项。如何完成此操作是特定于实现的。您可以自己滚动,例如,shellbash脚本(例如)可以使用提供的命令getoptsgetopt命令。

这些选项通常将选项定义为以连字符(-)开头的参数,某些选项可能会将后续参数用作其参数。功能更强大的解析器(例如getopt)支持混合短格式(-h)和长格式(--help)选项。

通常,大多数选项采用零或一个参数。这些参数有时也称为

支持的选项在程序代码中进行了编码(例如,getopts在Shell脚本中的调用中)。该选项之后的任何剩余的参数都被消耗通常被称为位置参数,当它们被给出的顺序是显著(这是不同于通常可以以任意顺序给出的选项)。

同样,脚本通过使用和使用位置参数来定义位置参数。

所以一个典型的命令

$ ls -I README -l foo 'bar car' baz

有七个参数:/usr/bin/ls-IREADME-lfoobar car,和baz可访问$0$6。的-l-I被解释为选项,后者具有一个参数(或)的README。剩下的是位置参数foobar carbaz)。

选项解析可以通过删除参数列表(例如,使用shiftset)来更改参数列表,从而仅保留位置参数,然后以$1..形式进行访问$n


2

由于该问题被标记为“ bash”,因此我在Bash手册中查找了相关章节。我在下面将这些引用的段落以及我自己的一句话摘要列出。

争论

命令后面的所有内容都是自变量。

一个简单的shell命令,例如 echo a b c由命令本身后跟参数(由空格分隔)组成。

简单命令是最常遇到的命令。它只是一个由空格分隔的单词序列,由外壳程序的一个控制运算符终止(请参见定义)。通常,第一个单词指定要执行的命令,其余单词是该命令的参数。

参量

在函数执行过程中,参数称为参数。

执行函数时,函数的参数将在执行过程中变为位置参数

参数是存储值的实体。它可以是名称,数字或下面列出的特殊字符之一。变量是用名称表示的参数。

位置参数是用一位或多位数字表示的参数,而不是一位数字0。位置参数是在调用Shell时从shell的参数中分配的,可以使用set builtin命令重新分配。位置参数N可以称为$ {N},或者当N由单个数字组成时称为$ N。

选件

没有专门的章节来定义选项是什么,但是在本手册中,它们被称为连字符前缀字符。

-p选项将输出格式更改为POSIX指定的格式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.