歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> Linux 程序的命令行處理

Linux 程序的命令行處理

日期:2017/2/27 14:15:02   编辑:更多Linux
  GNU/Linux命令行習慣 幾乎所有的GNU/Linux程序都遵循一些同樣的命令行解釋習慣,程序的參數通常分為了兩大類:選項(option)或者一些標志(flag)、其他參數。選項(option)主要是提供給程序一些運行上的選擇,而其他參數則通常是提供給程序運行的輸入之類的值。按照習慣,選項通常有兩種表達形式: ¨ 短形式:通常是由一個“-”加上一個字母組合而成。這種形式的好處是輸入快捷。 ¨ 長形式:通常是由兩個“-”加上一個單詞組合而成。這種形式的好處是形象、好記、直觀。 通常來說,一個程序讀於這兩種形式都支持。例如大多數的程序都有這樣的調用選項:“-h”和“――help”。一些選項需要知道後面跟著的參數,例如“ls –s /”,這裡其中的“/”就是一個參數。 使用getopt_long函數來處理 對於一個命令行的分析處理是很單調乏味的工作,需要做大量的諸如字符串的匹配之類的操作,不過幸運的是,GNU C函數庫 裡面提供了一個函數能夠使得這項工作變得容易得多。當然也許仍然沒有你想象的那麼容易。:))getopt_long這個函數就能夠同時“理解”長形式和短形式的參數,需要包括的頭文件是 下面我們通過一個實例來學習這個函數的使用。 假設我們要編寫的一個程序需要處理以下幾個參數: 短形式 長形式 含義 -h ――help 打印幫助信息 -s ――server 服務器IP地址 -b ――background 後台執行 要使用getopt_long()這個函數,我們需要提供兩個數據結構,第一個是一個字符串,該字符串中的每個字符來表示短形式的選項,如果某個選項後面需要跟一個參數,那麼就需要在這個字符後面加上一個“:”(冒號),例如“hs:b”就是我們這個例子中的結構。為了定義長形式表達的選項,我們需要定一個結構體數組。數組的每一項與一個長形式的參數相關,每項包括四個參數:通常來說,第一項是長形式的選項的字符串表達;第二項與後面是否有參數提取有關,如果後面有參數需要處理就是1,否則是0;第三項是NULL;最後一項則是與長形式相關聯的短形式表達的字符。另外,這個數組的最後一項必須全部置為0。 根據上面的說明,對於我們的例子,可以得到下面的一個數組: const strUCt option long_options [] =={ {“help ”,0,NULL,‘h ' }}, {“server ”,1,NULL,‘s ' }}, {“background”,0,NULL,‘b ' }}, {NULL,0,NULL,0 } }; 我們把傳給main函數的參數給getopt_long,他就一項一項的讀取處理,返回短形式表達的選項的字符,如果沒有找到選項則返回-1。通常我們都是在一個循環裡面反復調用getopt_long,然後通過一個switch語句來處理不同的選項。如果getopt_long遇到一個沒有定義的選項,則會返回一個“?”(問號)字符。下面是我們的例子,這是一個很典型的處理過程: #include #include #include const char*program_name; void print_usage (FILE*stream,int exit_code) { fprintf (stream,“Usage:%s options [ inputfile ....]\n ”,program_name); fprintf (stream, “ -h --help Display this usage information.\n ” “ -s --server ip Set the server IP.\n ” “ -b --background run in the backgound.\n ”); exit (exit_code); } int main (int argc,char*argv []) { int next_option; const char*const short_options =“hs:b ”; const struct option long_options [] =={ {“help ”,0,NULL,‘h ' }}, {“server”,1,NULL,‘s ' }}, {“background ”,0,NULL,‘b ' }}, {NULL,0,NULL,0 } }; const char*output_filename =NULL; int verbose =0; program_name =argv [0 ]; do {


next_option =getopt_long (argc,argv,short_options, long_options,NULL); switch (next_option) { case ‘h ':/*-h or --help */ print_usage (stdout,0); case ‘s ':/*-o or --output */ //ip =optarg; break; case ‘b ':/*-v or --verbose */ break; case ‘?':/*The user specified an invalid option.*/ code one (indicating abnormal termination).*/ print_usage (stderr,1); case -1:/*Done with options.*/ break; default:/*Something else:uneXPected.*/ abort (); } } while (next_option !=-1); /*The main program goes here.*/ return 0; }



Copyright © Linux教程網 All Rights Reserved