1. 程式人生 > >命令列引數解析函式getopt_long() 使用詳解

命令列引數解析函式getopt_long() 使用詳解

當一個用C語言編寫的Linux或UNIX程式執行時,它是從main函式開始的。對這些程式而言,main函式的宣告如下所示:

int main(int argc, char *argv[])

其中argc是程式引數的個數(int),argv是一個代表引數自身的字串陣列(char **)。無論作業系統何時啟動一個新程式,引數argc和argv都被設定並傳遞給main。這些引數通常由另一個程式提供,這個程式一般是shell,它要求作業系統啟動該新程式。shell接收使用者輸入的命令列,將命令列分解成單詞,然後把這些單詞放入argv陣列。

例如,如果我們給shell輸入如下命令:

$myprog
left right 'and center'

程式myprog將從main函式開始,main帶的引數是:
argc: 4
argv: {“myprog”, “left”, “right”, “and center”}
注意:引數個數包括程式名自身,argv陣列也包含程式名並將它作為第一個元素argv[0]。因為我們在shell命令裡使用了引號,所以第四個引數是一個包含了空格的字串。

人們常常希望使用命令列引數向程式傳遞資訊,許多工具程式也使用命令列引數來改變程式的行為或設定選項。通常,你可以使用以短橫線(-)開頭的命令列引數來設定這些所謂的標識(flag)或開關(switch)。我們建議在應用程式中,所有的命令列開關都應以一個短橫線開頭,其後包含單個字母或數字。如果需要,不帶後續引數的選項可以在一個短橫線後歸併到一起,如:ls -lstr。

在程式設計的時候,當命令列引數個數較多時,如果按照順序一個一個定義引數含義很容易造成混亂;如果程式只按順序處理引數的話,一些“可選引數”的功能將很難實現。為了解決此類問題,GNU C庫提供了函式以簡化C/C++程式中的解析工作。

注:Linux系統上可用的C編譯器是GNU C編譯器,它建立在自由軟體基金會的程式設計許可證的基礎上,因此可以自由釋出。GNU C 對標準C進行進一步擴充套件,以增強標準C的功能。函式getopt_long能夠同時處理長短兩種格式的選項,要使用這個函式,請包含標頭檔案

getopt_long(int argc, char* argv[], const char
*optstring, const struct option *longopts, int *longindex);
  • 引數optstring:負責處理短引數。也稱為選項指定符字串,該字串告訴getopt哪些選項可用,以及它們是否有關聯值。optstring只是一個字元列表,每個字元代表一個單字元選項。如果一個字元後面緊跟一個冒號,則表明該選項有一個關聯值作為下一個引數。

optstring的格式舉例說明比較方便,例如:
char *optstring = “abcd:”;
上面這個optstring在傳入之後,getopt函式將依次檢查命令列是否指定了 -a, -b, -c及 -d(這需要多次呼叫getopt函式,直到其返回-1),當檢查到上面某一個引數被指定時,函式會返回被指定的引數名稱(即該字母)
最後一個引數d後面帶有冒號,: 表示引數d是可以指定值的,如 -d 100 或 -d user。

  • 引數longopts:負責處理長引數。指向一個由option結構體組成的陣列,那個陣列的每一個元素都指明瞭一個長引數(形如”–name”的引數)名稱和性質:
 struct option {
               const char *name;
               int         has_arg;
               int        *flag;
               int         val;
           };

name:引數名稱

has_arg:指明是否帶引數值,其數值可選:

no_argument(即 0)表明這個長引數不帶引數(即不帶數值,如:--name)
required_argument (即 1) 表明這個長引數必須帶引數(即必須帶數值,如:--name Bob)
optional_argument(即 2)表明這個長引數後面帶的引數是可選的,(即--name和--name Bob均可)

flag:設定為NULL表示當找到該選項時,getopt_long返回在成員val裡給出的值。否則,getopt_long返回0,並將val的值寫入flag指向的變數。

val:getopt_long為該選項返回的值。

  • 引數longindex:如果longindex非空,它指向的變數將記錄當前找到引數符合longopts裡的第幾個元素的描述,即是longopts的下標值。

外部變數optarg:在getopt_long迴圈處理選項時,如果選項有一個關聯值,則外部變數optarg指向這個值。

參考連結:

[2] Linux程式設計(第4版)

相關推薦

getopt_long()----命令引數解析函式使用

為什麼需要命令列解析函式? 當一個用C語言編寫的Linux或UNIX程式執行時,它是從main函式開始的。函式宣告可以如下: int main(int argc, char *argv[]) 其中argc是程式引數的個數,argv是一個代表引數自身的字串陣列。無論作業系統何

命令引數解析函式getopt_long() 使用

當一個用C語言編寫的Linux或UNIX程式執行時,它是從main函式開始的。對這些程式而言,main函式的宣告如下所示: int main(int argc, char *argv[]) 其中argc是程式引數的個數(int),argv是一個代表引數自身的

getopt(win32) -- 命令引數解析函式

GNU libc提供了getopt和getopt_long用於解析命令列引數,很好用,想在windows下使用,就google了幾個win32下的C/C++寫得getopt,並作了一些比較。 程式裡往往會有許多開關的,執行時就要傳入許多引數值來開啟或關閉這些開關。以前

命令引數解析函式--getopt

原型: #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); 該函式的argc和argv引數通常直接從main()的引數直接傳遞而來。opt

linux命令引數解析函式 getopt

在學習開原始碼過程中,經常遇到命令列解析函式 getopt,網上查閱了一些資料,總結一下。 說到命令列解析,最簡單的方式就是利用c語言main函式的兩個引數argc和argv來實現,當 C 執行時庫程式啟動程式碼呼叫 main() 時,會將命令列的引數傳過來,引數個數放在a

python argparse:命令引數解析

## 簡介 本文介紹的是***[argparse](https://docs.python.org/3/library/argparse.html)***模組的基本使用方法,尤其詳細介紹**add_argument**內建方法各個引數的使用及其效果。 本文翻譯自[argparse的官方說明](ht

命令選項解析函式(C語言):getopt()、getopt_long()和getopt_long_only

上午在看原始碼專案 webbench 時,剛開始就被一個似乎挺陌生函式 getopt_long() 給卡住了,說實話這函式沒怎麼見過,自然不知道這哥們是幹什麼的。於是乎百度了一番,原來是處理命令列選項引數的,的確,正規點的大型程式一般第一步就是處理命令列引數

C++ 命令引數解析

文章目錄 說明 短引數之 getopt() 長引數之 getopt_long() 長引數之 getopt_long_only() 說明 主要參考以下部落格: 部落格一:getopt和g

【tensorflow】命令引數解析

1. tf.app.flags,用於支援接受命令列傳遞引數 import tensorflow as tf #第一個是引數名稱,第二個引數是預設值,第三個是引數描述 tf.app.flags.DEFINE_string('str_name', 'def_v_1',"descrip1")

golang命令引數解析

package main import ( "fmt" "os" ) func main(){ s:= os.Args fmt.Println(s) }   直接執行 輸出結果:[C:\Users\Administrator\AppData\Local\Temp\___go_bui

Linux(CentOS 7)命令模式安裝VMware Tools

本篇文章主要介紹瞭如何在Linux(CentOS 7)命令列模式安裝VMware Tools,具有一定的參考價值,感興趣的小夥伴們可以參考一下。 本例中為在Linux(以CentOS 7為例)安裝VMware Tools。 1.首先啟動CentOS 7,在

推薦《LinuxShell命令及指令碼程式設計例項》附下載連結

本書較全面地介紹了LinuxShell的知識點,以Bash為基礎,從LinuxShell的起源開始,到Shell中常用的命令,然後講述了Shell指令碼程式設計的基礎知識和Shell的條件語句、迴圈語句、函式、正則表示式、Shell指令碼中的輸入處理、重定向和Shell管道及

python命令引數解析

一、getopt模組  getopt.getopt(args, options[, long_options]) args為需要解析的命令列引數列表,一般為sys.argv[1:],這是因為argv[0]為指令碼的路徑。 options為希望識別的引數,如果該命令列引數

python 命令引數解析 argparse簡單分析

在python 2.7 後,不推薦使用 optparse, 而推薦使用 argparse. 其它的不多說,簡單的分析下我遇到的問題:我是想用 argparse 來解析不定長的命令列引數 例如: import argparse import sys parser = ar

CentOS6.8 命令切換圖形介面模式教程

注意:安裝虛擬機器 時儘量把記憶體調大點 #yum groupinstall "Desktop" -y #CentOS 6.x版本安裝GNOME包# #yum groupinstall "Chinese Support" -y

命令引數解析

對這種主函式形式一直不是很瞭解,今天研究了一下,所得如下: 當我們成功執行一個程式時,在Windows環境下會生成一個exe檔案,我們可以再命令列中開啟並執行這個程式。 比如說如下程式碼。 #

Golang: 使用flag包進行命令引數解析

最近在使用go開發cli(command-line-interface)時,通過對於官方文件以及他人部落格的學習,在此寫下個人認為更適合自己往後回顧的關於flag的使用說明。 工欲善其事必先利其器,先奉上flag官方文件解析 Demo0: pack

ffmpeg 原始碼學習 -- 之命令引數解析

ffmpeg 原始碼學習 -- 之ffmpeg命令列引數解析 大家通過git在安裝好cygwin之後,下載原始碼到(cygwin)home目錄,通過./configure  ...... ,可以新增一堆引數選項,執行可以生成config.mk等編譯使用的檔案,通過命令對工

Tensorflow:tf.app.run()與命令引數解析

首先給出一段常見的程式碼: if __name__ == '__main__': tf.app.run()12 它是函式入口,通過處理flag解析,然後執行main函式(或者接下來提到的xxx())(最後含有tf.app.run()的檔案,在此行之前肯定能找到def main

Python命令引數解析模組argparse

當寫一個Python指令碼時經常會遇到不同引數不同功能的情況,如何做一個更好看的命令幫助資訊以及對命令引數解析呢? 這就需要使用argparse模組 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os impor