getopts的用法解讀

2021-07-02 12:50:47 字數 3607 閱讀 9546

getopts 命令 用途

處理命令列引數,並校驗有效選項。 語法

getopts 選項字串

名稱 [ 引數 ...]

getopts 命令是 korn/posix shell 的內建命令,用來從引數列表檢索選項以及選項引數。選項由乙個+(加號)或者是由乙個-(減號)後跟乙個字元開始。乙個既不是以+,也不是以-開始的選項結束選項字串。每次呼叫 getopts 命令時,它將下乙個選項的值放置在名稱內,並將下乙個要處理的引數的索引置於 shell 變數 optind 中。一旦呼叫了shell , optind 將初始化為1。當選項以 +開頭,則+ 將預先設為名稱中的值。

如果選項字串中的字元後面帶有「:」(冒號),則預期此選項將帶有引數。當選項需要選項引數時,getopts 命令就將其置於變數 optarg 中。

當查詢到選項字串所不包含的選項字元,或者查詢到的選項沒有所需的選項引數時:

這種情況被認為是在將引數傳遞給所呼叫的應用程式的過程中所檢測到的錯誤,而不是在處理 getopts 命令的過程中所發生的錯誤;如上所述,寫入診斷訊息,但退出狀態將變為零。

以下任何字元都可以識別選項結尾:特殊選項- -,查詢到不以-,或者+為開頭的引數,或者遇到錯誤。

當遇到選項結尾時:

引數 選項字串

包含 getopts 命令識別的選項字串。如果字元後帶有冒號,則預期選項將帶有引數,應該以單獨引數的形式提供此引數。可以用空格將選項與引數分隔開。如果選項字元是未知的或者選項引數丟失,則選項字串中的第乙個字元將決定 getopts 命令的行為。

注意:應用程式不應該將問號和冒號字元作為選項字元。使用其它非字母數字的字元會產生不明的結果。
名稱

由 getopts 命令對查詢到的選項字元設定。

引數 ...

乙個或多個被空格分隔的字串,由 getopts 命令校驗是否是合法選項。如果省略引數 ,就使用位置引數。有關位置引數的更多資訊,請參見 korn shell 中的 引數替換。

注意: 一般來說,不必將引數指定為 getopts 命令的一部分,但在進行指令碼除錯時可能會有所幫助。

退出狀態

此命令返回下列出口值: 0

查詢到由選項字串指定的或未指定的選項。

<0

遇到選項結束或發生錯誤。 示例

下列 getopts 命令規定 a、b 和 c 為有效選項,並且選項 a 和c 帶有引數:

getopts a:bc: opt
下列 getopts 命令指定 a、b 以及c 為有效選項, 並且選項 a 和b 帶有引數,而且 getopts 在命令列遇到為定義的選項時,它將opt 的值設定為 ?:

getopts :a:b:c opt
下列指令碼分析和顯示其引數:

aflag= bflag=   while getopts ab: name do
case $name in
a)     aflag=1;;
b)     bflag=1    bval="$optarg";;
?)     printf"usage: %s: [-a] [-b value] args\n" $0                           exit 2;;
esac done
if [ ! -z "$aflag" ]; then
printf "option -a specified\ n"
fi
if [ ! -z "$bflag" ]; then
printf'option -b "%s" specified\ n' "$bval" fi   shift $(($optind -1)) printf "remaining arguments are: %s\n" "$*"
在bash裡有以下用途:
optstring  option 字串,會逐個匹配

varname    每次匹配成功的選項

arg        引數列表,沒寫時它會取命令列引數列表

$optind    特殊變數,option index,會逐個遞增

$optarg    特殊變數,option argument,不同情況下有不同的值

細則1:當optstring以」:「開頭時,getopts會區分invalid option錯誤和miss option argument錯誤。

invalid option時,varname會被設成?,$optarg是出問題的option;

miss option argument時,varname會被設成:,$optarg是出問題的option。

如果optstring不以」:「開頭,invalid option錯誤和miss option argument錯誤都會使

varname被設成?,$optarg是出問題的option。

細則2:當optstring中的字母跟」:「時,表明該option可接引數,引數(argument)放在$optarg中;

如果缺引數,且optstring是以」:「開頭,則varname的值會是:,$optarg是該option,

否則varname的值是?,$optarg是該option。(參照細則1)

例子:gg.sh

[root@localhost shel]# cat gg.sh

#gg.sh

#!/bin/bash

while getopts  "abc:def:ghi" flag

doecho "$flag" $optind $optarg         # 這裡$optind 是乙個索引序列號,$optarg 是選項裡所記錄的值,無值是為空,預設情況下選項是以空格分隔

done

echo "resetting"

optind=1    while getopts  "abc:def:ghi" flag

doecho "$flag" $optind $optarg

done

[root@localhost shel]# ./gg.sh -ab -c foo -f "foo bar" -h -gde

a 1 

b 2c 4 foo

f 6 foo bar

h 7g 7

d 7e 8

resetting

a 1b 2

c 4 foo

f 6 foo bar

h 7g 7

d 7e 8

上面是顯示結果。

如果調整一下所給引數的位置:

[root@localhost shel]# ./gg.sh -abc foo -f "foo bar" -h –gde  a 1

b 1c 3 foo

f 5 foo bar

h 6g 6

d 6e 7

resetting

a 1b 1

c 3 foo

f 5 foo bar

h 6g 6

d 6e 7

shell中getopts的用法

命令格式 getopts string args var name 兩個引數 如果不是很理解,先記住其命令格式和它的兩個引數代表的意義,看下面的操作。file name test bin bash while getopts a opt docase in a echo this is a vaul...

getopts 命令用法總結

getopts opstring name args getopts使用者獲得命令列位置引數 opstring 表示引數,表示 前邊的引數需要帶值 name 表示取得的引數,獲得的引數變數儲存到 optarg 裡邊 錯誤 1.opstring以colon 開始,silent error report...

shell 命令getopts用法

寫shell指令碼常見sh test.sh m 2 d 3的寫法 事例指令碼 bin bash while getopts a b c arg 選項後面的冒號表示該選項需要引數 do echo arg arg case arg in a echo a s arg optarg optind 引數存在...