翻譯:man getopt(1)中文手冊

NAME

getopt - 解析命令行選項(增強版)

SYNOPSIS

getopt optstring parameters
       getopt [options] [--] optstring parameters
       getopt [options] -o|--options optstring [options] [--] parameters

(譯註:html

  1. 後面的譯文中將分別稱呼這3種語法格式爲語法一、語法二、語法3
  2. 請區分option、parameter、argument、option argument、non-option parameter。如不清楚,請參考:http://www.javashuo.com/article/p-vuaszwvw-dm.html
    )

DESCRIPTION

getopt用於拆分(解析)命令行中的選項,以便能被shell程`如shell腳本)輕鬆解析,也用來檢查選項是否合理。該命令使用的是GNU getopt(3)程序實現的。shell

getopt的參數分爲兩部分:用於修改getopt解析模式的選項(即語法中的options和-o|--options optstring)和待解析的參數(即語法中的parameters部分)。第二部分將從第一個非選項參數開始,或者從"--"以後的第一項內容開始。若是在第一部分中沒有給定"-o|--options",則第二部分的第一個參數將用做短選項字符串。bash

若是設置了環境變量GETOPT_COMPATIBLE,或者它的第一個參數不是一個選項(即未使用"-"開頭的字符串,即語法1),getopt將生成與其它getopt(1)兼容的輸出。它仍然會對參數進行調整,也會識別可選參數(見下面的COMPATIBILITY部分)。函數

傳統的getopt(1)沒法拷貝空白字符以及其它特殊字符(特指shell的特殊字符)。要解決該問題,getopt能夠生成引號保護的輸出,而後再用shell去解釋(一般使用eval命令),這樣能夠保護這些特殊字符,但前提是不能使用兼容版本的getopt(即語法2和語法3能夠解決該問題)。要判斷所安裝的getopt是不是增強版的getopt,只需使用特殊選項"-T"進行測試便可。測試

OPTIONS

-a, --alternative
容許長選項(long options)用單個短橫線"-"開頭。(即單個短橫線開頭的選項也會被認爲是長選項)ui

-h, --help
輸出getopt的用法幫助信息。命令行

-l, --longoptions longopts
識別長選項(多個字符的選項)。longopts能夠一次性指定多個選項名稱,只需使用逗號分隔便可。該選項能夠屢次使用,longopts會進行累積。在longopts中,每一個長選項名稱後面均可以跟一個冒號,表示該選項須要一個參數,也能夠跟兩個冒號,表示該選項的參數是可選的。code

-n, --name progname
當getopt(3)報告錯誤時,getopt(3)將使用該名稱。注意,getopt(1)的錯誤仍然被報告爲來自getopt。htm

-o, --options shortopts
識別短選項(單個字符的選項)。若是沒有給定該選項,getopt的第一個未使用"-"開頭的參數(且不是option argument)將被用於短選項字符串。shortopts中的每一個短選項字符後面均可以跟一個冒號,表示該選項須要一個參數,也能夠跟兩個冒號,表示該選項的參數是能夠選的。shortopts的第一個字符能夠設置"+"或"-"來影響選項的解析方式和輸出方式(詳細內容見下面的SCANNING MODES)。blog

-q, --quiet
禁止getopt(3)輸出的報錯信息。

-Q, --quiet-output
禁止普通的輸出。但仍然會輸出getopt(3)產生的錯誤信息,除非同時指定了"-q"選項。

-s, --shell shell
指定使用哪一種shell的引號解析方式。若是未使用-s選項,則使用BASH。其它支持的shell類型包括:sh、bash、csh和tcsh。

-u, --unquoted
不要使用引號包圍輸出。注意,禁止引號保護後,空白字符和shell特殊字符將被破壞(就像其它版本的getopt(1)同樣)。

-T, --test
測試使用的getopt(1)是增強版的仍是傳統舊版的。增強版的getopt沒有任何輸出,且退出狀態碼爲4。其它版本的getopt(1)或者增強版的getopt設置了GETOPT_COMPATIBLE環境變量,則輸出"--",且退出狀態碼爲0。

-V, --version
輸出getopt的版本號並退出。

PARSING

本節指定getopt參數的第二部分的格式。下一節(OUTPUT)描述生成的輸出。這些參數一般是shell函數調用的參數。必須注意的是,調用shell函數時的每一個參數都剛好對應getopt參數列表中的一個參數(請參閱EXAMPLES)。全部的解析行爲都由GNU getopt(3)完成。

參數解析的方式是從左向右解析。每一個參數都被分類爲短選項、長選項、選項參數(option argument)和非選項類型的參數(non-option parameter)其中的一種。

一個簡單的短選項是使用"-"跟一個短選項字符。若是選項須要一個參數,這個選項參數能夠直接寫在選項字符的後面(譯註:例如-n3),或者做爲下一個parameter(例如,在命令中使用空白分隔(譯註:例如-n 3))。若是選項的參數是可選的,當須要解析給定的選項參數時,參數必須直接寫在選項字符後面(譯註:即不能用空白分隔選項和它的參數)。

能夠在單個短橫線後面跟多個短選項字符(譯註:例如tar -zcf的zcf都在單個"-"後面),只要它們不須要參數(容許最後一個給參數)便可(譯註,參考tar -zcf a.tar.gz的格式)。

長選項通常使用"--"開頭,後面跟長選項的名稱。若是長選項須要參數,可使用"="鏈接長選項和它的參數,或者將參數做爲長選項的下一個parameter(譯註,例如兩種形式:--file=FILE--file FILE)。若是長選項的參數是可選的,必須使用"="鏈接長選項和它的參數值。長選項能夠進行縮寫,只要不會產生歧義便可。

若是一個parameter不是使用"-"開頭,也不是它前面的選項所需的參數,那麼它就是一個非選項類型的參數(non-option parameter)。每一個跟在"--"長選項後的parameter老是被解析爲非選項類型的參數(non-option parameter)。若是設置了環境變量POSIXLY_CORRECT,或者若是短選項字符使用"+"開頭,全部剩餘的參數被解析爲非選項類型的參數(non-option parameter)。

OUTPUT

OUTPUT是前一小節所描述的每一個元素生成的。output輸出的順序和input給定的順序是一致的,但非選項類型的參數(non-option parameter)除外。可使用兼容模式(不使用引號保護)處理output,也可使用引號包圍的模式處理output,這樣空白字符、argument中的特殊字符以及非選項類型的參數均可以被原樣保留(見下面的QUOTING)。在shell腳本中處理output時,通常來講,各個元素能夠一個一個地被處理(大多數shell語言中可使用shift命令實現),但這種模式是有缺陷的,非引號保護模式下,若是有特殊字符,各個元素可能會被切割在預料以外的位置。

若是解析parameter時出現了問題,例如須要的argument沒有找到,或者沒法識別某個選項,將向stderr中報告錯誤,且產生錯誤的那個選項將不會有任何output,並返回一個非0狀態碼。

對於短選項,將生成一個由"-"和一個選項字符組成的parameter。若是選項有選項參數(argument),下一個parameter將被做爲該選項的argument。若是選項有一個可選參數,但沒找到這個參數,此時,若是在引號保護模式下,將生成一個使用引號包圍的空參數做爲下一個參數,若是在兼容模式(非引號保護)下,則不會生成下一個參數。注意,許多其它版本的getopt(1)不支持可選參數。

(譯註:例如"-a"選項,將生成-a做爲一個parameter,若是它有選項參數,則生成-a ARG共兩個parameter,若是選項參數可選,在引號保護模式下,生成"-a" ""共兩個parameter,在非引號保護模式下,將只有-a一個parameter)

若是單個橫線"-"後面一次性跟了多個短選項字符,將會分隔它們爲獨立的parameter。(譯註,如"-avz"將生成-a -v -z共3個parameter)。

對於長選項,將生成一個由"--"和完整的長選項名組成的parameter。只要它是長選項,不管它是縮寫形式的,仍是使用單個短橫線"-"指定的,生成parameter時都會補齊。此外,長選項的參數處理方式和短選項處理方式同樣。

通常來講,在處理完全部option和它們的argument以前,不會生成非選項類型的參數(non-option parameter)的output。在處理非選項類型參數時,首先會生成一個"--"做爲一個獨立的parameter,而後各個非選項類型的參數(non-option parameter)將按照順序生成各自的output,每一個都是單獨的parameter。只有當短選項字符的第一個字符是"-"時,纔會在它們被發現的位置處生成該非選項類型的參數(non-option parameter)的Output(若是使用語法1,將不支持該功能。此時,全部前綴的"-"和"+"都會被忽略)。

QUOTING

在兼容模式下,空白字符、argument或非選項類型的參數(non-option parameter)中的特殊字符將不會被正確處理。由於output是提供給shell腳本的,腳本並不知道如何將這個output拆分紅不一樣的parameter。要避免該問題,可使用增強版getopt提供的QUOTING功能,它會使用引號保護這些parameter,當這些output再次提供給shell時(通常會用eval命令來解析),將能正確地被拆分紅獨立的parameter。

若是設置了GETOPT_COMPATIBLE環境變量,或者使用了語法1,或者使用了"-u"選項,將禁用QUOTING功能。

不一樣的shell使用不一樣的引號處理規則。可使用"-s"選項指定你想使用的shell。目前支持的shell類型有:sh、bash、csh和tcsh。事實上,只有兩種風格的區別:類sh(sh-like)的引號處理風格和類csh(csh-like)的引號處理風格。即便你使用其它類型的shell,也仍然能夠指定這幾種shell。

SCANNING MODES

短選項的第一個字符可使用"+"或"-"開頭來指定一種掃描模式。若是使用語法1,這兩個特殊符號將被忽略,但若是設置了環境變量POSIXLY_CORRECT,則仍然會執行掃描。

若是第一個字符爲"+",或者設置了環境變量POSIXLY_CORRECT,只要發現了第一個非選項類型的參數(non-option parameter)就會中止解析(例如,parameter未使用"-"開頭),並且它後面的全部參數都會被解釋爲非選項類型的參數(non-option parameter)。

若是第一個字符爲"-",非選項類型的參數(non-option parameter)的output將根據它所在的位置進行生成。而默認狀況下,它們是被收集到一個獨立的"--"參數以後的。在這種掃描模式下,其實也會生成"--"參數,只不過生成在全部parameter的最尾部。

相關文章
相關標籤/搜索