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

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/10/08/9757959.html
-Advertisement-
Play Games

NAME getopt 解析命令行選項(加強版) SYNOPSIS (譯註: 1. 後面的譯文中將分別稱呼這3種語法格式為語法1、語法2、語法3 2. 請區分option、parameter、argument、option argument、non option parameter。如不清楚,請參考 ...


NAME

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

SYNOPSIS

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

(譯註:

  1. 後面的譯文中將分別稱呼這3種語法格式為語法1、語法2、語法3
  2. 請區分option、parameter、argument、option argument、non-option parameter。如不清楚,請參考:https://www.cnblogs.com/f-ck-need-u/p/9758075.html
    )

DESCRIPTION

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

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

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

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

OPTIONS

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

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

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

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

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

-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的最尾部。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GraphQL 既是一種用於 API 的查詢語言也是一個滿足你數據查詢的運行時。 GraphQL來自Facebook,它於2012年開始開發,2015年開源。 GraphQL與編程語言無關,可以使用很多種語言/框架來構建Graph 伺服器,包括.NET Core。 像Github,Pinterest ...
  • 前一篇文章記錄了簡單的多線程編程的幾種方式,但是在實際的項目中,也需要等待多線程執行完成之後再執行的方法,這個就叫做多線程的同步,或者,由於多個線程對同一對象的同時操作造成數據錯亂,需要線程安全。這篇文章主要記錄多線程的同步非同步如何實現線程安全的幾種方式的筆記,如有錯誤,請大神不吝賜教。 因為代碼里 ...
  • 官方教程 安裝linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :選擇和你本機適用的Linux版本,我這裡用的是18.04. 第二步 :註冊秘鑰,產品倉儲,以及安裝依賴項,每台機器只需要註冊一次, 第三步:安裝.net core ...
  • 1. 2.重啟電腦 3.在winstore下載和安裝 ubuntu 4.查看當前win10子系統的linux版本 lsb_release -a 5.設置root賬號密碼, 在終端輸入命令 sudo passwd, 然後輸入當前用戶的密碼, enter,終端會提示我們輸入新的密碼並確認, 此時的密碼 ...
  • 原文地址:https://www.cnblogs.com/szlblog/p/9045209.html AspNetCore 使用Redis實現分散式緩存 上一篇講到了,Core的內置緩存:IMemoryCache,以及緩存的基礎概念。本篇會進行一些概念上的補充。 本篇我們記錄的內容是怎麼在Core ...
  • 美國封殺中興通訊確實令人措手不及。但是除了慷慨陳詞和向國家伸手要錢以外,更不能頭疼醫頭、腳疼醫腳,而應該有一個巨集觀的思考。中興事件絕不是一個缺芯的問題,而是基礎軟硬體的缺失,是生態的不健全。 作者:劉學習 中國缺少自己的中國芯,沒有自己的操作系統!倪光南院士在幾十年前就曾大聲疾呼,並因此與聯想的掌門 ...
  • 不使用Visual Studio等IDE,只使用csc.exe和記事本構建一個C#控制台應用程式。 ...
  • C#是微軟.NET平臺下最重要的編程語言,它與C、C++不同,C#編寫的源程式是托管在.NET平臺下的。C#源程式經C#編譯器編譯成中間語言(IL,Intermediate Language),再經CLR(Common Language Runtime,公共語言運行時(庫))編譯成CPU可執行的指令 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...