linux getopt 命令

Man_In_The_Night發表於2019-01-27

getopt命令是一個在處理命令列選項和引數時非常方便的工具。它能夠識別命令列引數,從而在指令碼中解析它們時更方便

 

1、命令的格式

getopt命令可以接受一系列任意形式的命令列選項和引數,並自動將它們轉換成適當的格式。它的命令格式如下:

getopt optstring parameters

optstring是這個過程的關鍵所在。它定義了命令列有效的選項字母,還定義了哪些選項字母需要引數值。 首先,在optstring中列出你要在指令碼中用到的每個命令列選項字母。然後,在每個需要引數值的選項字母后加一個冒號。getopt命令會基於你定義的optstring解析提供的引數。

[root@master ~]# getopt ab:cd -a -b test1 -cd test2 test3
 -a -b test1 -c -d -- test2 test3

如果想忽略這條錯誤訊息,可以在命令後加-q選項。

[root@master ~]# getopt -q ab:cd -a -b test1 -cde test2 test3
 -a -b 'test1' -c -d -- 'test2' 'test3'

 

2、選項字串optstring

"a:b:cd::e",這就是一個選項字串。對應到命令列就是-a ,-b ,-c ,-d, -e 。冒號又是什麼呢? 冒號表示引數,一個冒號就表示這個選項後面必須帶有引數(沒有帶引數會報錯哦),但是這個引數可以和選項連在一起寫,也可以用空格隔開,比如-a123 和-a   123(中間有空格) 都表示123是-a的引數;兩個冒號的就表示這個選項的引數是可選的,即可以有引數,也可以沒有引數,但要注意有引數時,引數與選項之間不能有空格(有空格會報錯的哦),這一點和一個冒號時是有區別的。

 

3、在指令碼中使用getopt

可以在指令碼中使用getopt來格式化指令碼所攜帶的任何命令列選項或引數,但用起來略微複雜。

方法是用getopt命令生成的格式化後的版本來替換已有的命令列選項和引數。用set命令能夠做到。

set命令的選項之一是雙破折線(--),它會將命令列引數替換成set命令的命令列值。

然後,該方法會將原始指令碼的命令列引數傳給getopt命令,之後再將getopt命令的輸出傳 給set命令,用getopt格式化後的命令列引數來替換原始的命令列引數,看起來如下所示。

set -- $(getopt -q ab:cd "$@")

[root@master ~]# cat hh.sh
#!/bin/b=<F12>h
# Extract command line options & values with getopt
set -- $(getopt -q ab:cd "$@")
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" ;;
    -d)
        echo "Found the -d 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

shift表示對引數左移,預設shift(shift 1),shift n表示引數左移3位,參考:https://blog.csdn.net/zhu_xun/article/details/24796235

if  [ -n str ]表示當串的長度大於0時為真(串非空),參考:https://www.cnblogs.com/ariclee/p/6137456.html

break 跳出迴圈,break n 跳出指定的第n個封閉的迴圈,參考:https://www.cnblogs.com/xiaojianblogs/p/8242443.html

 

執行結果

[root@master ~]# sh hh.sh -a -b test -cd test1  test2 test3
Found the -a option
Found the -b option, with parameter value 'test'
Found the -c option
Found the -d option
Parameter #1: 'test1'
Parameter #2: 'test2'
Parameter #3: 'test3'

 

參考:

http://www.jxbh.cn/article/2096.html

https://www.cnblogs.com/qingergege/p/5914218.html

相關文章