使用 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 命令的選項說明: -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