1. 程式人生 > >使用 getopt 處理命令列長引數(長選項)

使用 getopt 處理命令列長引數(長選項)

getopt命令並不是bash的內建命令,它是由util-linux包提供的外部命令。

getopt 與 getopts 的區別

  • getopts 是 shell 內建命令, getopt 是一個獨立外部工具
  • getopts 使用語法簡單,getopt 使用語法複雜
  • getopts 不支援長引數(長選項,如 --option), getopt 支援
  • getopts 不會重排所有引數的順序,getopt會重排引數順序 (getopts 的 shell 內建 OPTARG 這個變數,getopts 通過修改這個變數依次獲取引數,而 getopt 必須使用 set 來重新設定位置引數,然後在 getopt 中使用 shift 來依次獲取引數)
  • 如果某個引數中含有空格,那麼這個引數就變成了多個引數。因此,基本上,如果引數中可能含有空格,那麼必須用getopts(新版本的 getopt 也可以使用空格的引數,只是傳參時,需要用 雙引號 包起來)。
getopt 命令選項說明:
getopt 命令的選項說明:
-a 使getopt長選項支援"-"符號打頭,必須與-l同時使用
-l 後面接getopt支援長選項列表
-n program如果getopt處理引數返回錯誤,會指出是誰處理的這個錯誤,這個在呼叫多個指令碼時,很有用
-o 後面接短引數選項,這種用法與getopts類似,
-u 不給引數列表加引號,預設是加引號的(不使用-u選項),例如在加不引號的時候 --longopt "select * from db1.table1" $2只會取到select ,而不是完整的SQL語句。

選項的使用定義規則類似 getopts :
例如
ab:c::

意思是:
a 後沒有冒號,表示沒有可以引數
b 後跟一個冒號,表示有一個必要的引數
c 後跟兩個冒號,表示有一個可選的引數(引數必須緊挨著選項)
長選項的定義相同,但用逗號分割。

示例:
#!/bin/bash

#定義選項, -o 表示短選項 -a 表示支援長選項的簡單模式(以 - 開頭) -l 表示長選項 
# a 後沒有冒號,表示沒有引數
# b 後跟一個冒號,表示有一個必要引數
# c 後跟兩個冒號,表示有一個可選引數(可選引數必須緊貼選項)
# -n 出錯時的資訊
# -- 也是一個選項,比如 要建立一個名字為 -f 的目錄,會使用 mkdir -- -f ,
#    在這裡用做表示最後一個選項(用以判定 while 的結束)
# [email protected] 從命令列取出引數列表(不能用用 $* 代替,因為 $* 將所有的引數解釋成一個字串
#                         而 
[email protected]
是一個引數陣列) TEMP=`getopt -o ab:c:: -a -l apple,banana:,cherry:: -n "test.sh" -- "[email protected]"` # 判定 getopt 的執行時候有錯,錯誤資訊輸出到 STDERR if [ $? != 0 ] then echo "Terminating....." >&2 exit 1 fi # 重新排列引數的順序 # 使用eval 的目的是為了防止引數中有shell命令,被錯誤的擴充套件。 eval set -- "$TEMP" # 處理具體的選項 while true do case "$1" in -a | --apple | -apple) echo "option a" shift ;; -b | --banana | -banana) echo "option b, argument $2" shift 2 ;; -c | --cherry | -cherry) case "$2" in "") # 選項 c 帶一個可選引數,如果沒有指定就為空 echo "option c, no argument" shift 2 ;; *) echo "option c, argument $2" shift 2 esac ;; --) shift break ;; *) echo "Internal error!" exit 1 ;; esac done #顯示除選項外的引數(不包含選項的引數都會排到最後) # arg 是 getopt 內建的變數 , 裡面的值,就是處理過之後的 [email protected](命令列傳入的引數) for arg do echo '--> '"$arg" ; done


相關推薦

使用 getopt 處理命令引數選項

getopt命令並不是bash的內建命令,它是由util-linux包提供的外部命令。 getopt 與 getopts 的區別 getopts 是 shell 內建命令, getopt 是一個獨

常用終端命令Mac版持續更新

cd 進入當前目錄 ls 檢視當前目錄的內容 mkdir 建立一個目錄 pwd 顯示當前目錄的路徑名 rm 刪除檔案或目錄 sudo -s 獲取root許可權 vim 進入檔案 wq 儲存修改的檔案 先按下esc之後,:wq 退出檔案 to

Java命令執行引數說明大全(轉載

6.    -verbose[:class|gc|jni] 在輸出裝置上顯示虛擬機器執行資訊。 verbose和verbose:class含義相同,輸出虛擬機器裝入的類的資訊,顯示的資訊格式如下: [Loaded java.io.FilePermission$1 from shared objects fi

標頭檔案、預處理命令、名稱空間作用域、連結

關於與include搭配的符號(雙引號 & 尖括號):   C++有一些編寫好的標頭檔案(比如標準函式庫等等),它們存放在VC++的Include資料夾裡。當我們使用#include <

可變引數---函式的定義---形參

收集引數---(函式的定義---形參) 1. 在引數前加*         將所有的引數,打包成元組         可以直接使用位置引數傳遞實參 2. 在引數前加**  &n

已有的exe,始終帶引數執行,不需要每次輸入命令的方法create sfx archive

原始需求:由於讓其他人操作時,可能由於看錯或者是手動輸入錯誤,導致命令列引數並不是符合預期的值,結果不能得到想要的結果 工具:winrar 英文中文都可以(不能使用快壓,快壓沒有這個功能)--自行下載(我的資源裡也可以找到) 操作方法: 開啟rar, 選擇要進行自解壓格式的exe檔案,然

scala筆記-變引數5

變長引數 在Scala中,有時我們需要將函式定義為引數個數可變的形式,則此時可以使用變長引數定義函式。 def sum(nums: Int*) = { var res = 0 for (num <- nums) res += num res } sum(1,

google gflags 處理命令引數

#include <string> #include <iostream> #include <gflags/gflags.h> using namespace std; DEFINE_string(input_path, "empty" , "input f

nodejs漸入佳境[7]-yargs處理命令引數

yargs用於方便的處理命令列引數。匯入yargs包,在專案路徑下: 1 > npm install --save yargs 原始檔案 app.js: 12345678 const yargs = requi

python中處理命令引數的模組optpars

optpars是python中用來處理命令列引數的模組,可以自動生成程式的幫助資訊,功能強大,易於使用,可以方便的生成標準的,符合Unix/Posix 規範的命令列說明。使用 add_option() 來加入選項,使用 parse_args() 來解析命令列。add_opti

Systemtap 學習四表示式,命令傳遞引數

$ptr->member ptr是一個在被探測的上下文中可以獲得的核心中的指標 二、通過stap命令列傳入的引數。 字面量可以是在雙引號中的string,也可以是整數值。通過在stap命令結尾

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

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

Python中處理命令引數

Python文件中的例子: import getopt, sys def main():     try:         opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])     except getopt.Ge

C++11嚐鮮:Variadic Function Templates帶變引數的函式模板

程式碼1 #include <iostream> #include <string> #include <boost/ref.hpp> #include <b

linux shell中的命令自動補全compgen complete命令引數解析

很多時候,當我們寫一個指令碼時,我們總會提供一些可選的命令選項。當可選項比較多的時候,比如git, 如果能夠提供命令自動補全,無疑是錦上添花的事。而且個人認為,這種方式,比採用將命令做成選擇選單要更好一些。 假設我們現在這樣一個指令碼,指令碼執行命令時bsu,  類似gi

使用 getopt() 進行命令處理

所有 UNIX® 程式甚至那些具有圖形使用者介面(graphical user interface,GUI)的程式,都能接受和處理命令列選項。對於某些程式,這是與其他程式或使用者進行互動的主要手段。具有可靠的複雜命令列引數處理機制,會使得您的應用程式更好、更有用。不過很多

main:處理命令選項

有時我們需要給main函式傳遞實參, 我們可以把命令列選項通過兩個形參傳遞給main函式: int mian(int argc, char *argv[]) { ... }; argv是argument value,是一個數組,它的元素是指向C風格字串的指標;第一個形參argc是argument coun

ansible命令傳遞引數的方法

    在命令列裡面傳值得的方法: ansible-playbook testyml --extra-vars "hosts=vm-1 user=root"   還可以用json格式傳遞引數: ansible-playbook test.yml

Android實現儲存圖片,圖、佈局webView等

最近開發遇到一個問題,分享的時候 需要分享一個佈局內容,但是要用圖片分享的格式,最開始思考感覺不可能實現,手機上很少有功能可以實現長圖儲存的, 可是經理說,髮長微博的時候就是自動儲存的長圖片,頓時傻眼了,人家是怎麼做的呢??? 本已經放棄該功能,可這麼一說,又開始在網上找,並沒有很明確的找到

1.3windows cmd批處理命令下使用blat發郵件簡潔模板

rem ----郵件內容-----set body="test mail" rem ----郵件主題----set s="測試test"rem ----收件郵箱-----set [email protected]rem ----發件郵箱-----set [email protected]r