getopt命令是一個在處理命令行選項和參數(shù)時非常方便的工具。它能夠識別命令行參數(shù),從而在腳本中解析它們時更方便。
1、命令的格式
getopt命令可以接受一系列任意形式的命令行選項和參數(shù),并自動將它們轉換成適當?shù)母袷健K拿罡袷饺缦拢?
getopt optstring parameters
optstring是這個過程的關鍵所在。它定義了命令行有效的選項字母,還定義了哪些選項字母需要參數(shù)值。 首先,在optstring中列出你要在腳本中用到的每個命令行選項字母。然后,在每個需要參數(shù)值的選項字母后加一個冒號。getopt命令會基于你定義的optstring解析提供的參數(shù)。
下面南昌網(wǎng)絡公司-百恒網(wǎng)絡為大家舉一個getopt工作的簡單例子,讓大家可以更好的了解它。
$ getopt ab:cd -a -b test1 -cd test2 test3
-a -b test1 -c -d -- test2 test3
$
optstring定義了四個有效選項字母:a、b、c和d。冒號(:)被放在了字母b后面,因為b選項需要一個參數(shù)值。當getopt命令運行時,它會檢查提供的參數(shù)列表(-a -b test1 -cd test2 test3),并基于提供的optstring進行解析。注意,它會自動將-cd選項分成兩個單獨的選項,并插入雙破折線來分隔行中的額外參數(shù)。
如果指定了一個不在optstring中的選項,默認情況下,getopt命令會產(chǎn)生一條錯誤消息。
$ getopt ab:cd -a -b test1 -cde test2 test3
getopt: invalid option -- e
-a -b test1 -c -d -- test2 test3
$
如果想忽略這條錯誤消息,可以在命令后加-q選項。
$ getopt -q ab:cd -a -b test1 -cde test2 test3
-a -b 'test1' -c -d -- 'test2' 'test3'
$
注意,getopt命令選項必須出現(xiàn)在optstring之前?,F(xiàn)在應該可以在腳本中使用此命令處理命令行選項了。
2、在腳本中使用getopt
可以在腳本中使用getopt來格式化腳本所攜帶的任何命令行選項或參數(shù),但用起來略微復雜。那么具體如何操作呢?下面南昌網(wǎng)絡公司就來和大家探討一下:
方法是用getopt命令生成的格式化后的版本來替換已有的命令行選項和參數(shù)。用set命令能夠做到。
set命令的選項之一是雙破折線(--),它會將命令行參數(shù)替換成set命令的命令行值。
然后,該方法會將原始腳本的命令行參數(shù)傳給getopt命令,之后再將getopt命令的輸出傳 給set命令,用getopt格式化后的命令行參數(shù)來替換原始的命令行參數(shù),看起來如下所示。
set -- $(getopt -q ab:cd "$@")
現(xiàn)在原始的命令行參數(shù)變量的值會被getopt命令的輸出替換,而getopt已經(jīng)為我們格式化好了命令行參數(shù)。
利用該方法,現(xiàn)在就可以寫出能幫我們處理命令行參數(shù)的腳本。
$ cat test18.sh
#!/bin/bash
# Extract command line options & values with getopt
#
set -- $(getopt -q ab:cd "$@")
#
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) param="$2"
echo "Found the -b option, with parameter value $param"
shift ;;
-c) echo "Found the -c option" ;;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1 for param in "$@"
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ] done
#
$
你會注意到它跟腳本test17.sh一樣,唯一不同的是加入了getopt命令來幫助格式化命令行參數(shù)。
現(xiàn)在如果運行帶有復雜選項的腳本,就可以看出效果更好了。
$ ./test18.sh -ac
Found the -a option
Found the -c option
$
當然,之前的功能照樣沒有問題。
$ ./test18.sh -a -b test1 -cd test2 test3 test4
Found the -a option
Found the -b option, with parameter value 'test1'
Found the -c option
Parameter #1: 'test2'
Parameter #2: 'test3'
Parameter #3: 'test4'
$
現(xiàn)在看起來相當不錯了。但是,在getopt命令中仍然隱藏著一個小問題。看看這個例子。
$ ./test18.sh -a -b test1 -cd "test2 test3" test4
Found the -a option
Found the -b option, with parameter value 'test1'
Found the -c option
Parameter #1: 'test2
Parameter #2: test3'
Parameter #3: 'test4'
$
getopt命令并不擅長處理帶空格和引號的參數(shù)值。它會將空格當作參數(shù)分隔符,而不是根據(jù)雙引號將二者當作一個參數(shù)。幸好還有另外一個辦法能解決這個問題。
以上便是南昌網(wǎng)絡公司-百恒網(wǎng)絡為大家介紹的關于linux中getopt命令的使用方法,希望能夠?qū)Υ蠹矣兴鶐椭?。此外,本公司專業(yè)從事網(wǎng)站建設、微信開發(fā)、APP開發(fā)等服務,如有需要,歡迎大家來電咨詢,洽談合作!