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

2021-07-04 12:26:42 字數 2007 閱讀 1815

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

getopt 與 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 的結束)

# $@ 從命令列取出引數列表(不能用用 $* 代替,因為 $* 將所有的引數解釋成乙個字串

# 而 $@ 是乙個引數陣列)

# 判定 getopt 的執行時候有錯,錯誤資訊輸出到 stderr

if [ $? != 0 ]

then

echo "terminating....." >&2

exit 1

fi# 重新排列引數的順序

# 使用eval 的目的是為了防止引數中有shell命令,被錯誤的擴充套件。

eval set -- "$temp"

# 處理具體的選項

while true

do case "$1" in

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 內建的變數 , 裡面的值,就是處理過之後的 $@(命令列傳入的引數)

for arg do

echo '--> '"$arg" ;

done

使用 getopt 處理命令行長引數

getopt命令並不是bash的內建命令,它是由util linux包提供的外部命令。getopt 與 getopts 的區別 getopts 是 shell 內建命令,getopt 是乙個獨立外部工具 getopt 命令選項說明 getopt 命令的選項說明 a 使getopt長選項支援 符號打頭...

Linux程式設計 用getopt處理命令列引數

函式宣告如下 include int getopt int argc,char const argv,const char optstrin g extern char optarg extern int optind,opterr,optopt 以下是一些主要的介紹。詳細的介紹參閱 該函式的arg...

使用getopt解析命令列引數

python中可以使用getopt來解析命令列引數,其定義如下 getopt args,shortopts,longopts 其中,getopt返回opts,args元組,opts是根據shortopts,longopts引數解析出來的 key,value 列表,而其他剩餘引數就會放到args列表中...