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 的結束)
- # $@ 從命令行取出參數列表(不能用用 $* 代替,因為 $* 將所有的參數解釋成一個字符串
- # 而 $@ 是一個參數數組)
getopt命令與getopts命令不同,它實際上是通過將參數規范化來幫助我們處理的。具體的用法,如下面的腳本:
#!/bin/bash #echo $@ #-o或--options選項后面接可接受的短選項,如ab:c::,表示可接受的短選項為-a -b -c,其中-a選項不接參數,-b選項后必須接參數,-c選項的參數為可選的 #-l或--long選項后面接可接受的長選項,用逗號分開,冒號的意義同短選項。 #-n選項后接選項解析錯誤時提示的腳本名字 ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n 'example.sh' -- "$@"` if [ $? != 0 ]; then echo "Terminating..." exit 1 fi #echo $ARGS #將規范化后的命令行參數分配至位置參數($1,$2,...) eval set -- "${ARGS}" while true do case "$1" in -a|--along) echo "Option a"; shift ;; -b|--blong) echo "Option b, argument $2"; shift 2 ;; -c|--clong) case "$2" in "") echo "Option c, no argument"; shift 2 ;; *) echo "Option c, argument $2"; shift 2; ;; esac ;; --) shift break ;; *) echo "Internal error!" exit 1 ;; esac done #處理剩余的參數 for arg in $@ do echo "processing $arg" done
需要注意的是,像上面的-c選項,后面是可接可不接參數的,如果需要傳遞參數給-c選項,則必須使用如下的方式:
#./getopt.sh -b 123 -a -c456 file1 file2 Option b, argument 123 Option a Option c, argument 456 processing file1 processing file2