第2期:argument、parameter以及option有什麼區別?

平常交流中,咱們一般用參數一詞說明函數或者命令的使用方法,好比:html

  • HashMap 能夠經過構造函數的 initialCapacity 參數設置初始容量,我傳的 參數 是 1000。
  • rm 命令 -r 參數用來刪除目錄。

但在看英文文檔時,常常會交替的出現argumentparameter以及option,尤爲是argument和parameter,更讓我困惑,應該不僅是同義詞這麼簡單吧?因而我特意查閱了一些資料。主要針對Java和Shell下的語義進行了梳理:java

Java中的argument和parameter

Java語境中的argument和parameter,在官方文檔中給予了很是明確的說明。Oracle Java官方教程的 Passing Information to a Method or a Constructor 一節,提到:linux

Note: Parameters refers to the list of variables in a method declaration. Arguments are the actual values that are passed in when the method is invoked. When you invoke a method, the arguments used must match the declaration's parameters in type and order.git

因此,在Java中,parameter指的是函數定義。而argument指的函數調用github

所以,在Java Doc中,使用的是@param註解來講明參數含義:shell

/** * @param initialCapacity the initial capacity. * @throws IllegalArgumentException if the initial capacity is negative. */
    public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
複製代碼

而用IllegalArgumentException表示調用時傳遞的參數不合法。編程

/** * Thrown to indicate that a method has been passed an illegal or inappropriate argument. * * @author unascribed * @since JDK1.0 */
public class IllegalArgumentException extends RuntimeException {
複製代碼

另外,Java語境中的含義,也是大多數編程語言中的含義,這一點在維基百科 Parameter (computer programming) - Wikipedia 中有說明:數組

The term parameter (sometimes called formal parameter) is often used to refer to the variable as found in the function definition, while argument (sometimes called actual parameter) refers to the actual input supplied at function call.bash

維基百科也用形式參數(formal parameter)指代parameter,而argument則對應於實際參數(actual parameter)。oracle

Shell中的argument、option和parameter

argument

Shell中,不管是命令、腳本或函數,都沒法像Java那樣定義參數,因此也就不存在Java中嚴格意義的parameter了。事實上,命令行的功能太複雜,組合太多,根本沒法像單一功能的Java函數那樣明確的parameter。雖然如此,argument仍是相似的,指運行期傳入的值。好比bash的man文檔裏有這樣的說明:

SHELL GRAMMAR Simple Commands A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.

具體到執行階段,除了第一個單詞是執行的命令或函數,後面用空格分隔的單詞都稱做argument。好比ls -l /tmp,一共有2個argument:-l/tmp

不過管道符或重定向都不能算做argument,本質上它們不屬於前面的命令。因此不能說ls -l /tmp >files.txt裏的>files.txt是第3個argument。

option

option,是具體程序本身定義和識別,一個程序接受那些option是程序裏寫死的,因此option指在具體的命令或函數下有意義。option能夠看作對argument的細分,它們通常是帶---的argument。這樣便於程序去解析。因此ls -l /tmp的第2個argument是一個option。

維基百科的Command-line interface,對option是這樣描述的

A command-line option or simply option (also known as a flag or switch) modifies the operation of a command; the effect is determined by the command's program.

parameter

若是非要和Java中的parameter對應,能夠認爲Shell中是位置參數(Positional Parameters),第1個參數,第2個參數等等,很是簡單粗暴。至於它們是什麼含義,那是程序實現的問題了,這也形成了命令行或shell函數須要本身解析位置參數。簡單的好處就是包容性強。

不過,bash文檔裏,仍是有專門對parameter說明的一節:

A parameter is an entity that stores values. It can be a name, a number, or one of the special characters listed below under Special Parameters. A variable is a parameter denoted by a name.

而在parameter下又細分爲:位置參數(Positional Parameters)、特殊參數(Special Parameters,如$#$?)、shell變量(Shell Variables,即又shell自動設置或使用的變量,好比PATH)以及數組(Arrays)。這裏的parameter更像是特殊的變量。

更實用的區分

Shell上面的解釋,有點太晦澀,並且不實用。卻是Stack Overflow上有個解釋:bash - Difference between terms: 「option」, 「argument」, and 「parameter」? - Stack Overflow,雖然不許確,但更實用。他認爲:

A parameter is an argument that provides information to either the command or one of its options

在這個解釋下,是這樣區分的:

  • argument是命令後傳遞的全部東西的統稱。(這一點和開始的解釋同樣)
  • argument中有一種是option,它們以---開頭。(這一點和開始的解釋同樣)
  • option接受的值稱做parameter(或者稱做value也罷)。好比sort -k 1,1就是option的parameter,表示排序的列是第一列。

總結

  • 在不嚴格的狀況下,parameter和argument是能夠混用的。
  • Java或一般的編程語言中,parameter指代函數聲明中的變量;而argument指代函數被調用時傳遞的實際輸入。
  • 在Shell或命令行中,argument的含義和Java是相似的,指代調用或運行時的輸入值。但parameter的含義有點晦澀和不實用。若干結合option,一個簡單而實用的區分是:argument是統稱,option是---開頭的argument,而parameter當作option的值。

參考

  1. Passing Information to a Method or a Constructor (The Java™ Tutorials _ Learning the Java Language _ Classes and Objects)
  2. Parameter (computer programming) - Wikipedia
  3. Command-line interface - Wikipedia
  4. bash - Difference between terms: 「option」, 「argument」, and 「parameter」? - Stack Overflow

《Java與Linux學習週刊》每週五發布,同步更新於:Github知乎掘金

相關文章
相關標籤/搜索