閱讀718 返回首頁    go 技術社區[雲棲]


Linux指令語法的一般模式

這篇文章主要講Linux下指令的選項和參數的一般使用模式. 我們先介紹Linux下指令語法的一般模式, 即選項和參數的一般使用模式. 然後講解如何在程序中添加選項和參數的解析處理功能.

1 Linux指令語法的一般模式

Linux下一條指令的執行往往可以附帶有選項和參數. 什麼是選項什麼是參數呢? 一條指令往往帶有非常多的特性, 指令的選項可以用來控製這些特性的使用. 舉ls指令為例, 在以下的指令中:

ls -d dir

'-d'就是ls指令的一個選項, 表示隻列出目錄本身而不是目錄下的文件內容. 'dir'則是ls指令的參數, 上麵那條ls指令表示列出dir目錄. 對於一條指令, 也可以隻指定選項或者隻指定參數, 又或者兩者都不需要, 這要視具體的指令本身和它的使用場景. 如果一條指令既包含選項有包含參數, 那麼, 一般都是先輸入選項再輸入參數.

指令的選項可以按兩種情況分類. 一種是按選項的長短分類, 可分為長選項和短選項. 短選項一般形式是一條橫杠'-' 後麵跟著單個字母, 如'-d'就是一個短選項. 長選項則一般是兩條橫杠'--'後麵跟著一個或者多個單詞, 檔次往往解釋了這個選項的具體作用. 指令的某個選項可能會同時提供短選項和長選項兩種形式. 例如grep指令的忽略大小寫選項, 它的短選項是'-i', 而長選項則是'--ignore-case'. 短選項可以減少鍵入的字符, 而長選項則更容易讓人明白選項的具體含義. 指令選項的另一種分類則是按選項後麵是否有跟參數來劃分, 可分為無參選項和帶參選項. 上麵舉的例子中ls'-d'選項和grep的'-i'選項都是無參選項, 我們來看帶參選項的一個例子:

jenny@marry:~/src$ grep -n -A 2 'while' opts.sh 
6:while getopts "ab:" option
7-do
8-    case $option in

這個例子中, 我們利用grep來檢索opts.sh文件中包含'while'單詞的行, 其中'-A'是一個帶參選項, 後麵跟著的數字2就是這個選項的參數, 它表示輸出匹配行之後額外的兩行.

如果不清楚指令的具體用法, 可以通過man指令查看指令的文檔說明. 指令的man手冊中, 一般會有固定的幾張章節, 其中有幾個是比較重要的. 首先是DESCRIPTION章節, 這個章節主要介紹這個指令的的功能是什麼, 如果不熟悉指令的話, 應該首先閱讀這個章節. 另外一個是SYNOPSIS章節, 這個章節主要介紹指令的使用語法的, 舉pstree為例, 我們來看看他的SYNOPSIS章節:

PSTREE(1)                                                           User Commands                                                           PSTREE(2)

NAME
       pstree - display a tree of processes

SYNOPSIS
       pstree [-a, --arguments] [-c, --compact] [-h, --highlight-all, -Hpid, --highlight-pid pid] [-g] --show-pgids] [-l, --long]
       [-n, --numeric-sort] [-N, --ns-sortns [-p, --show-pids] [-s, --show-parents] [-S, --ns-changes] [-u, --uid-changes] [-Z, --security-context]
       [-A, --ascii, -G, --vt100, -U, --unicode] [pid, user]
       pstree -V, --version

以上pstree指令的SYNOPSIS章節中, pstree主要有兩種使用方法. 一種是pstree後麵隻跟-V或者--version(這也是-V選項的長選項形式)參數, 這將在終端輸出pstree的版本信息. 另一種則是pstree後麵跟著-V和--version選項以外的選項, 選項之後還需要跟著參數:進程id(pid)或者用戶名(user). 選項放在方括號[]中, 如[-a, --arguments]表示這個一個可選選項, 是否要指定這個選項視具體使用情況而言. 如要要了解指令某一選項的具體做用, 可以查看man手冊的OPTION章節. 指令包含的選項的具體用法在OPTION這一章節中一般會有詳細的介紹.

2 為命令行程序添加選項處理功能

可為為自己編寫的命令行程序添加選項處理功能, 這裏簡要介紹C語言和bash腳本中如何給程序添加選項處理功能.

2.1 為C語言程序添加選項處理功能

Linux上的glibc提供了getopt函數, 該函數可用來處理指令的輸入選項.
通過:

man 3 getopt

可以查看getopt函數使用手冊. getopt的手冊裏除了介紹它的使用方法外, 還有具體的使用樣例, 對於理解它的使用很有幫助.

getopt的函數原型:

int getopt(int argc, char * const argv[], const char *optstring);

其中, optstring參數是一個定義了選項的字符串, 比如

char *optstring = "ab";

表示有可接收兩個無參選項'-a'和'-b'. 如果要指定帶參選項, 則可以使用:

char *optstring = "ab:";

以上optstring表示接收一個無參選項'-b'和一個帶參選項'-b'. 當getopt解析到一個帶參選項時, 它會嚐試提取選項的參數. 這時, 可以利用optarg(char *類型)來訪問該選項的參數. optarg是glibc庫中定義好的, 可以直接使用.

處理完指令的選項, 如何獲得選項後麵的指令參數呢? 這時可以利用optind變量. optind是一個整形變量, 和optarg變量類似, optind變量也是預先定義好可以直接使用的.getopt函數執行前, optind的值為0. 後續getopt函數每處理完一個選項, optind便會先前移動相應步長. 最終, optind總是指向下一個待處理的輸入選項或者參數.所以, 在處理完所有的指令選項之後, argv[optind]...argv[argc-1]便是指令的輸入參數了.

getopt隻能用來處理短選項, 如果要處理長選項的話, 可以使用geopt_long或者get_opt_long_only函數. 同getopt一樣, 這兩個函數也有相應的man手冊和參考樣例.

2.2 為bash腳本添加選項處理功能

類似與C中的getopt函數, bash中內置了可以用來處理getopts命令解析指令選項. getopts指令的optstring的格式和C中getopt函數類似. 同時, getopts命令也有OPTARG變量指向帶參選項的參數和OPTIND變量指向下一個待解析的選項或參數. 來看一個使用bash的getopts內置指令解析命令行選項的例子:

#!/bin/sh

while getopts "ab:" option
do
    case $option in
    a) echo this is a option;; 
    b) echo this is b option, and the argument is $OPTARG;; 
    \?) echo unknown opton: $option;;
    esac
done

以上例子中, 利用getopts內置指令解析了無參選項'-a', 和帶參選項'-b'. 選項後麵若是還有參數待處理要怎麼辦了? 這時候可以利用bash中的參數移位指令shift, 來看看具體如何操作:

#!/bin/sh

while getopts "ab:" option
do
    case $option in
    a) echo this is a option; shift 1;; 
    b) echo this is b option, and the argument is $OPTARG; shift 2;; 
    \?) echo unknown opton: $option;;
    esac
done

echo arguments: $@

我們看到, 每處理完一個選項就執行一次shift讓參數往前移動一位或者兩位. 這樣到最後, 處理所有選項後$@便包含剩下的參數. 來看看執行效果:

jenny@marry:~/src$ sh opts.sh -a -b hello arg1 arg2
this is a option
this is b option, and the argument is hello
arguments: arg1 arg2
jenny@marry:~/src$ 

我們可以看到, 通過執行shift指令, 解析網指令選項後$@的值為"arg1 arg2", 而這便是我們需要的跟在指令選項後的指令參數.

最後更新:2017-07-16 21:32:29

  上一篇:go  Go語言與數據庫開發:01-01
  下一篇:go  使用ODPS進行拚車分析