使用getopt命令解析shell指令碼的命令列選項

2021-07-25 23:49:33 字數 1961 閱讀 3422

在之前的一篇文章中,介紹了如何利用shell內建的getopts命令來幫助我們處理shell指令碼選項和引數,其缺點是只能處理短選項,無法處理長選項。下面,本文將要介紹的是getopt命令,它可以同時處理短選項和長選項。

在getopt的較老版本中,存在一些bug,不大好用,在後來的版本中解決了這些問題,我們稱之為getopt增強版。通過-t選項,我們可以檢查當前的getopt是否為增強版,返回值為4,則表明是增強版的。

#getopt -t

#echo $?

4#getopt -v

getopt (enhanced) 1.1.4

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 -- "$"

while

true

docase

"$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 $@

doecho

"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

#./getopt.sh --blong 123 -a --clong=456 file1 file2

option b, argument 123

option a

option c, argument 456

processing file1

processing file2

使用getopt解析命令列引數

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

getopt 解析命令選項及引數

形式 int getopt argc,argv,引數列表 int getopt int argc,char const argv,const char optstring 呼叫一次,返回乙個選項。在命令列選項引數再也檢查不到optstring 中包含的選項時,返回 1,同時optind儲存第乙個不包...

getopt函式,命令列解析

getopt函式 函式功能 用來解析命令列引數,引數argc和ar 分別代表引數個數和內容,跟main 函式裡的命令列引數一樣 函式所在標頭檔案 include 函式原型定義 int getopt int argc,char const ar const char optstring 引數optst...