1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      shell命令行參數(shù)(getopt和getopts)

      這里還有上一篇,這部分是基礎(chǔ):
      https://blog.51cto.com/steed/2443313

      創(chuàng)新互聯(lián)專注于企業(yè)成都營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、蠡縣網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為蠡縣等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

      getopt 命令

      使用getopt命令,可以解析任何命令行選項(xiàng)和參數(shù),但是用法比較復(fù)雜。getopt的命令用法如下:

      $ getopt --help
      
      用法:
       getopt optstring parameters
       getopt [options] [--] optstring parameters
       getopt [options] -o|--options optstring [options] [--] parameters
      
      選項(xiàng):
       -a, --alternative            允許長(zhǎng)選項(xiàng)以 - 開始
       -h, --help                   這個(gè)簡(jiǎn)短的用法指南
       -l, --longoptions <長(zhǎng)選項(xiàng)>  要識(shí)別的長(zhǎng)選項(xiàng)
       -n, --name <程序名>         將錯(cuò)誤報(bào)告給的程序名
       -o, --options <選項(xiàng)字符串>  要識(shí)別的短選項(xiàng)
       -q, --quiet                  禁止 getopt(3) 的錯(cuò)誤報(bào)告
       -Q, --quiet-output           無正常輸出
       -s, --shell           設(shè)置 shell 引用規(guī)則
       -T, --test                   測(cè)試 getopt(1) 版本
       -u, --unquoted               不引用輸出
       -V, --version                輸出版本信息
      
      $ 

      用法一共有3種格式,下面都會(huì)用到。

      在命令行中簡(jiǎn)單使用

      先看第一個(gè)最簡(jiǎn)單的格式:

       getopt optstring parameters

      第一部分是命令名。
      第二部分optstring(選項(xiàng)字符串),是這個(gè)命令解析的格式。
      第三部分parameters(getopt命令的參數(shù)),就是需要解析的內(nèi)容。
      因此,getopt會(huì)按照 optstring 的設(shè)置,將 parameters 解析為相應(yīng)的選項(xiàng)和參數(shù)。參考示例來理解:

      $ getopt ab:cd -ad value1 -b best1 value2 value3
       -a -d -b best1 -- value1 value2 value3
      $ 

      主要理解 ab:cd 的意義。
      這里定義的都是短選項(xiàng),4個(gè)字母代表有4個(gè)選項(xiàng)。b后面的冒號(hào)表示這個(gè)選項(xiàng)需要一個(gè)參數(shù)。如果不給選項(xiàng)b一個(gè)參數(shù),就會(huì)報(bào)錯(cuò):

      $ getopt ab:cd -ad value1 -b
      getopt:選項(xiàng)需要一個(gè)參數(shù) -- b
       -a -d -- value1
      $ 

      使用雙破折線
      如果添加了雙破折線,那么無輪后面是什么,都會(huì)作為參數(shù)而不是選項(xiàng)來處理:

      $ getopt ab:cd -- -ad value1 -b best1 value2 value3
       -- -ad value1 -b best1 value2 value3
      $ getopt ab:cd -ad value1 -- -b best1 value2 value3
       -a -d -- value1 -b best1 value2 value3
      $ 

      這依然是是命令用法的第一種格式,雙破折線是parameters內(nèi)容的一部分。
      雙破折線出現(xiàn)位置之前的內(nèi)容按照optstring的設(shè)置來解析,之后的內(nèi)容一律認(rèn)為是參數(shù)。即使有類似選項(xiàng)的內(nèi)容,被認(rèn)作為是參數(shù)。

      參數(shù)包含空格的問題
      第一種格式和第二、第三種在功能上也是有區(qū)別的。這里輸出的參數(shù)都是不帶引號(hào)的。而另外兩種格式輸出的參數(shù)都是帶引號(hào)的。
      重要的區(qū)別不在引號(hào)上,而是這種用法不支持處理帶空格和引號(hào)的參數(shù)值。它會(huì)將空格當(dāng)作參數(shù)分隔符,而不是根據(jù)雙引號(hào)將二者當(dāng)作一個(gè)參數(shù)。

      支持長(zhǎng)選項(xiàng)

      參考上面的示例,加上長(zhǎng)選項(xiàng)的支持。使用長(zhǎng)選項(xiàng)的示例如下:

      $ getopt -o ab:cd --long arga,argb:,argc,argd -- -ad -b best --argd value1 value2
       -a -d -b 'best' --argd -- 'value1' 'value2'
      $ 

      這是命令用法的第三種格式。
      -o 表示定義短選項(xiàng)
      --long 其實(shí)是--longoptions,不過省略任意個(gè)字母程序都能認(rèn)識(shí)。或者也可以用-l。這個(gè)是指定長(zhǎng)選項(xiàng)的。所有內(nèi)容都要連起來,不能有空格。選項(xiàng)之間用逗號(hào)隔開。定義完之后,在用雙破折號(hào)隔開,后面的內(nèi)容就是parameters。

      錯(cuò)誤報(bào)告引用的程序名

      之前已經(jīng)試過一次解析錯(cuò)誤的報(bào)告了:

      $ getopt ab:cd -ad value1 -b
      getopt:選項(xiàng)需要一個(gè)參數(shù) -- b
       -a -d -- value1
      $ 

      這里錯(cuò)誤報(bào)告的是getopt錯(cuò)誤,可以把這個(gè)默認(rèn)的內(nèi)容替換掉。一般是換成執(zhí)行的腳本的名字。
      這里使用命令用法的第二種格式,把 optstring 和 parameters 都放到雙破折線后面:

      $ getopt -- ab:cd -ad value1 -b best1
       -a -d -b 'best1' -- 'value1'
      $ 

      這樣在雙破折線前面就可加getopt命令的選項(xiàng),這里要指定-n選項(xiàng):

      $ getopt -n test.sh -- ab:cd -ad value1 -b 
      test.sh:選項(xiàng)需要一個(gè)參數(shù) -- b
       -a -d -- 'value1'
      $ 

      這里看到包裹錯(cuò)誤是,名字已經(jīng)被替換掉了。
      在腳本中,可以使用 $(basename $0) 或者直接用\$0。

      禁止錯(cuò)誤報(bào)告
      還有一個(gè)-q參數(shù),可以禁止錯(cuò)誤報(bào)告,解析錯(cuò)誤的選項(xiàng)和參數(shù)將被丟棄:

      $ getopt -n test.sh -q -- ab:cd -ad value1 -b 
       -a -d -- 'value1'
      $ 

      可選參數(shù)

      還有一種可選參數(shù),使用兩個(gè)冒號(hào)。這個(gè)選項(xiàng)可以有一個(gè)或零個(gè)參數(shù):

      $ getopt -o a::bc: -l arga::,argb,argc: -- -a value1 --arga value2
       -a '' --arga '' -- 'value1' 'value2'
      $ getopt -o a::bc: -l arga::,argb,argc: -- -avalue1 --arga=value2
       -a 'value1' --arga 'value2' --
      $ 

      第一次執(zhí)行是傳遞的參數(shù)是錯(cuò)誤的。因?yàn)槭强蛇x參數(shù),參數(shù)和值之間不能有空格隔開,否則會(huì)有歧義。必須要連在一起才能認(rèn)為是前一個(gè)選項(xiàng)的參數(shù)。否則就被認(rèn)作是獨(dú)立的參數(shù)了。

      小結(jié)

      getopt 命令的選項(xiàng)所指定的選項(xiàng)字符串的規(guī)則:

      • 短選項(xiàng),每一個(gè)字符代表一個(gè)選項(xiàng)
      • 長(zhǎng)選項(xiàng),每一個(gè)字符串代表一個(gè)選項(xiàng),用逗號(hào)分隔
      • 選項(xiàng)后跟一個(gè)冒號(hào),表示選項(xiàng)需要一個(gè)參數(shù)
      • 選項(xiàng)后跟兩個(gè)冒號(hào),表示選項(xiàng)有一個(gè)可選參數(shù)(一個(gè)或零個(gè)參數(shù))
      • 可選參數(shù)的參數(shù)和值之間不能有空格,短選項(xiàng)直接連起來,長(zhǎng)選項(xiàng)加等號(hào)連起來

      在腳本中使用 getopt

      現(xiàn)在已經(jīng)可以用getopt命令,將命令行參數(shù)按照規(guī)定的格式解析成規(guī)整的格式了。并且在解析過程中,還能發(fā)現(xiàn)參數(shù)格式錯(cuò)誤的情況并報(bào)告。
      接下來就是在腳本中使用經(jīng)過getopt命令解析后的參數(shù)了。

      set 命令

      要在腳本中使用getopt。首先,要用getopt命令生成格式化后的版本來替換已有的命令行選項(xiàng)和參數(shù)。需要用到set命令。
      set命令能夠處理shell中的各種變量。具體不展開,這里只用了這個(gè)命令的一個(gè)選項(xiàng),雙破折線(--)。效果是將命令行參數(shù)替換成set命令的參數(shù)值。
      然后,該方法會(huì)將原始腳本的命令行參數(shù)傳給getopt命令執(zhí)行,之后再將getopt命令的輸出傳給set命令,用getopt格式化后的命令行參數(shù)來替換原始的命令行參數(shù):

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

      現(xiàn)在原始的命令行參數(shù)變量的值會(huì)被getopt命令的輸出替換。而getopt已經(jīng)為我們格式化好了命令行參數(shù)。

      直接使用

      在之前編寫的腳本的基礎(chǔ)上,只要在開頭加上一行代碼,就可以直接使用了:

      set -- $(getopt a:b:s:u "$@")

      加上這句后,就是讓后續(xù)的代碼處理getopt返回的參數(shù),而不是調(diào)用命令時(shí)的命令行參數(shù)。
      驗(yàn)證效果:

      $ ./format.sh -u -a after -b befor value1 value2 value3
      BEFOR_VALUE1_AFTER
      BEFOR_VALUE2_AFTER
      BEFOR_VALUE3_AFTER
      $ ./format.sh -u -a after -b befor value1 "value2 value3" value4
      BEFOR_VALUE1_AFTER
      BEFOR_VALUE2_AFTER
      BEFOR_VALUE3_AFTER
      BEFOR_VALUE4_AFTER
      $ 

      第二條命令并不能處理帶空格的參數(shù),因?yàn)檫@里使用的是getopt的第一種格式。

      使用第二種格式來解析

      要處理空格,就需要使用第二種格式(或者第三種),將命令修改為如下:

      set -- $(getopt -- a:b:s:u "$@")

      簡(jiǎn)單的在最前面加上雙破折線就好了。這條語(yǔ)句是錯(cuò)誤的,后面還要修改。

      再來驗(yàn)證一下:

      $ ./format.sh -u -a after -b befor value1 "value2 value3" value4
      'BEFOR'_'VALUE1'_'AFTER'
      'BEFOR'_'VALUE2_'AFTER'
      'BEFOR'_VALUE3'_'AFTER'
      'BEFOR'_'VALUE4'_'AFTER'
      $ 

      使用第二、第三種格式,會(huì)用引號(hào)來限定參數(shù)的內(nèi)容。但是引號(hào)干擾了set命令。

      使用 eval 命令
      這里出現(xiàn)了一個(gè)新的問題,不但沒有正確的處理空格,輸出的內(nèi)容還有額外的引號(hào)。空格的問題先放一放,這里需要用到eval命令來解決新問題。

      eval 命令用于將其后的內(nèi)容作為單個(gè)命令讀取和執(zhí)行,這里用于處理getopt命令生成的參數(shù)的轉(zhuǎn)義字符。

      關(guān)于eval命令,還有一種使用的情景。有時(shí)候在腳本中拼接出來的字符串即使打印出來看正確。并且直接復(fù)制、粘貼在交互界面中也能正確讀被當(dāng)做命令運(yùn)行。但是卻無法在腳本中被執(zhí)行。這個(gè)時(shí)候就可以使用eval命令來解決。它能夠把字符串當(dāng)做命令來執(zhí)行。
      在腳本中通過各種引用和判斷拼接出一個(gè)復(fù)雜的命令的時(shí)候,有時(shí)候就會(huì)出現(xiàn)無法執(zhí)行的情況。這時(shí)候就直接賦值、粘貼去交換界面試一下,如果拼接的結(jié)果本身沒問題,那么加上eval命令后,應(yīng)該就能用運(yùn)行。

      修改命令如下:

      eval set -- $(getopt -- a:b:s:u "$@")

      再次驗(yàn)證:

      $ ./format.sh -u -a after -b befor value1 "value2 value3" value4
      BEFOR_VALUE1_AFTER
      BEFOR_VALUE2 VALUE3_AFTER
      BEFOR_VALUE4_AFTER
      $ 

      第一種格式加上eval命令也是沒有問題的,所以可以無腦用上。

      解決空格問題

      只要能正確的使用getopt的第二種或第三種格式,那么參數(shù)包含空格的問題也就解決了。看上一小節(jié)。

      參數(shù)解析錯(cuò)誤并退出

      執(zhí)行命令時(shí),使用錯(cuò)誤的參數(shù),當(dāng)前的效果如下:

      $ ./format.sh -u -w -a after -b befor value1 "value2 value3" value4
      getopt:無效選項(xiàng) -- w
      BEFOR_VALUE1_AFTER
      BEFOR_VALUE2 VALUE3_AFTER
      BEFOR_VALUE4_AFTER
      $ 

      解析發(fā)現(xiàn)問題了,并且報(bào)告了,但是腳本沒有終止,而是繼續(xù)執(zhí)行。如果要判斷出解析錯(cuò)誤,就需要使用\$?參數(shù)。然后退出腳本則是用exit命令。
      這里直接直接使用\$?并無法獲取到參數(shù)解析錯(cuò)誤的結(jié)果。因?yàn)榇藭r(shí)的結(jié)果是set命令(也可能是eval命令)的執(zhí)行結(jié)果,而getopt是再前一條的命令。
      解決這個(gè)問題,要先把getopt命令執(zhí)行一遍,進(jìn)行判斷。然后再用set調(diào)用一遍,可以直接使用之前執(zhí)行的結(jié)果:

      getopt_cmd=$(getopt -n $(basename $0) -- a:b:s:u "$@")
      [ $? -ne 0 ] && exit 1
      eval set -- "$getopt_cmd"

      這里還加上了報(bào)告錯(cuò)誤時(shí)名稱的定義。exit退出時(shí)也要指定退出狀態(tài)為非0,因?yàn)槭沁\(yùn)行錯(cuò)誤。

      驗(yàn)證效果:

      $ ./format.sh -v -a after -w -b
      format.sh:無效選項(xiàng) -- v
      format.sh:無效選項(xiàng) -- w
      format.sh:選項(xiàng)需要一個(gè)參數(shù) -- b
      $ echo $?
      1
      $ 

      現(xiàn)在解析有問題后,就會(huì)直接退出。

      完整的代碼示例

      這里加上長(zhǎng)選項(xiàng)以及可選參數(shù)的功能。
      多加了一個(gè)參數(shù) -m, --mark 由于指定使用什么連接符:

      • 默認(rèn)直接連,不使用連接符號(hào)
      • 加上選項(xiàng),默認(rèn)使用下劃線連接
      • 為選項(xiàng)加上參數(shù)后,則使用參數(shù)來連接

      參數(shù)比較多,加了 -h, --help 選項(xiàng)打印參數(shù)說明。

      完整代碼如下:

      $ cat format.sh
      #!/bin/bash
      mark=""      # 連接符號(hào)
      prefix=""    # 前綴
      base="test"  # 默認(rèn)字符串
      suffix=""    # 后綴
      upper=off    # 是否大寫
      # 顯示聲明一下這是個(gè)數(shù)組變量,其實(shí)沒有必要
      declare -a names  # 需要格式化輸出的所有原始字符串
      # 打印的幫助信息
      help_str="
      參數(shù)說明:
        -h, --help:           打印幫助信息
        -m, --mark [連接符]:  使用連接符,默認(rèn)是下劃線(_),可以指定
        -a, --after string:   添加后綴
        -b, --befor string:   添加前綴
        -s, --string string:  指定中間的字符串,默認(rèn)是“test”
        -u, --upper:          全大寫輸出
      "
      # 解析命令行參數(shù)
      getopt_cmd=$(getopt -o m::ha:b:s:u --long mark::,help,after:,befor:,string:,upper -n $(basename $0) -- "$@")
      [ $? -ne 0 ] && exit 1
      eval set -- "$getopt_cmd"
      # 解析選項(xiàng)
      while [ -n "$1" ]
      do
          case "$1" in
              -m|--mark)
                  case "$2" in
                      "")
                          mark="_"
                          shift ;;
                      *)
                          mark="$2"
                          shift ;;
                  esac
                  ;;
              -h|--help)
                  echo -e "$help_str"
                  exit ;;
              -a|--after)
                  suffix="$2"
                  shift ;;
              -b|--befor)
                  prefix="$2"
                  shift ;;
              -s|--string)
                  base="$2"
                  shift ;;
              -u|--upper)
                  upper=on ;;
              --) shift
                  break ;;
               *) echo "$1 is not an option"
                  exit 1 ;;  # 發(fā)現(xiàn)未知參數(shù),直接退出
          esac
          shift
      done
      # 解析參數(shù)
      while [ -n "$1" ]
      do
          names=("${names[@]}" "$1")
          shift
      done
      names[0]=${names[0]:-$base}
      for name in "${names[@]}"
      do
          # 添加前綴和后綴
          output="${prefix:+${prefix}${mark}}${name}${suffix:+${mark}${suffix}}"
          # 判斷是否要全大寫輸出
          if [ $upper = on ]
          then
              output=${output^^}
          fi
          # 輸出結(jié)果
          echo "$output"
      done
      $ 

      驗(yàn)證效果:

      $ ./format.sh -a after -b befor VALUE1 "VALUE2 VALUE3" VALUE4
      beforVALUE1after
      beforVALUE2 VALUE3after
      beforVALUE4after
      $ ./format.sh -a after -b befor --mark 
      befor_test_after
      $ ./format.sh -a after -b befor --mark="||" -u
      BEFOR||TEST||AFTER
      $ ./format.sh -a after -b befor --mark="||" -u --help
      
      參數(shù)說明:
        -h, --help:           打印幫助信息
        -m, --mark [連接符]:  使用連接符,默認(rèn)是下劃線(_),可以指定
        -a, --after string:   添加后綴
        -b, --befor string:   添加前綴
        -s, --string string:  指定中間的字符串,默認(rèn)是“test”
        -u, --upper:          全大寫輸出
      
      $ 

      有g(shù)etopt就夠用了。順便再簡(jiǎn)單講下getopts。
      getopts功能上差一點(diǎn),不過封裝的更高級(jí),用起來更簡(jiǎn)單,需要的代碼也會(huì)少一點(diǎn)。

      getopts 命令

      getopts是另一個(gè)解析命令行參數(shù)的工具。它是Bash的內(nèi)部命令。
      它的優(yōu)勢(shì)在于:

      • 不需要通過一個(gè)外部程序來處理位置參數(shù)
      • 可以很容易地設(shè)置用來解析的Shell變量
      • getopts 定義在 POSIX 中

      不支持長(zhǎng)選項(xiàng):

      getopts 不能解析 GUN 風(fēng)格的長(zhǎng)選項(xiàng)(--long),也不能解析 XF86 風(fēng)格的長(zhǎng)選項(xiàng)(-long)

      getopt 是將選項(xiàng)和參數(shù)處理后只生成一個(gè)輸出。我們還要用 set 來完成傳遞的工作。
      getopts 能夠和已有的shell參數(shù)變量配合默契。每次調(diào)用時(shí),一次只處理命令行上檢測(cè)到的一個(gè)參數(shù)。處理之后,它會(huì)退出并返回一個(gè)大于0的退出狀態(tài)碼。這樣就非常方便的可以在while循環(huán)中使用。

      基本用法

      getopts 會(huì)使用到一下3個(gè)變量:
      OPTIND: 存放下一個(gè)要處理的參數(shù)的索引。這是 getopts 在調(diào)用過程中記住自己狀態(tài)的方式。
      OPTARG: 由 getopts 找到的選項(xiàng)所對(duì)應(yīng)的參數(shù)。
      OPTERR: 值為0或1。指示Bash是否應(yīng)該顯示由 getopts 產(chǎn)生的錯(cuò)誤信息。

      getopts 命令的基本語(yǔ)法:

      getopts 選項(xiàng)字符串 名稱 [參數(shù)]

      選項(xiàng)字符串(OPTSTRING):getopts 會(huì)有哪些選項(xiàng),哪些是有參數(shù)的(選項(xiàng)后有冒號(hào))
      名稱(VARNAME):getopts 會(huì)將找到的選項(xiàng)賦值給這個(gè)名稱的變量
      參數(shù)(ARGS):一般情況向缺省,getopts會(huì)去解析腳本調(diào)用時(shí)的所有的參數(shù)。如果執(zhí)行了這個(gè)參數(shù),getopts就不解析傳遞給腳本的參數(shù)了,而是解析這里的參數(shù)。

      getopts 不會(huì)移動(dòng)變量。在處理完所有的選項(xiàng)后,命令就會(huì)停止,并將參數(shù)留給我們來繼續(xù)處理。此時(shí)可以先用shit命令配合OPTIND的值來移動(dòng)到第一個(gè)參數(shù)的位置:

      shift $[ $OPTIND - 1 ]

      錯(cuò)誤報(bào)告模式

      getopts命令支持兩種錯(cuò)誤報(bào)告模式:

      • 詳細(xì)錯(cuò)誤報(bào)告模式
      • 抑制錯(cuò)誤報(bào)告模式

      對(duì)于產(chǎn)品中的腳本,推薦使用抑制錯(cuò)誤報(bào)告模式。

      詳細(xì)錯(cuò)誤報(bào)告模式
      在詳細(xì)錯(cuò)誤報(bào)告模式下,如果 getopts 遇到了一個(gè)無效的選項(xiàng),VARNAME 的值會(huì)被設(shè)置為問號(hào)(?),并且變量 OPTARG 不會(huì)被設(shè)置。如果需要的參數(shù)沒找到,VARNAME的值也會(huì)被設(shè)置為問號(hào)(?),變量 OPRARG 也不會(huì)被設(shè)置,并且會(huì)打印一個(gè)錯(cuò)誤信息。

      抑制錯(cuò)誤報(bào)告模式
      在抑制錯(cuò)誤報(bào)告模式下,如果 getopts 遇到一個(gè)無效的選項(xiàng),VARNAME 的值會(huì)被設(shè)置為問號(hào)(?),并且變量 OPTARG 會(huì)被設(shè)置為選項(xiàng)字符。如果需要的參數(shù)沒找到,VARNAME的值會(huì)被設(shè)置為冒號(hào)(:),并且變量 OPTARG 中會(huì)包含選項(xiàng)字符。
      要使用抑制錯(cuò)誤報(bào)告模式,只需要在調(diào)用 getopts 時(shí),設(shè)置選項(xiàng)字符串(OPTSTRING)時(shí)以冒號(hào)開頭即可。下面的例子用的就是一直錯(cuò)誤報(bào)告模式。

      示例代碼

      這里使用抑制錯(cuò)誤報(bào)告模式,所以需要自己分析并且報(bào)告解析錯(cuò)誤。都在代碼里了:

      $ cat say_hello.sh 
      #!/bin/bash
      defaultname="nobody"  # 默認(rèn)的名字
      declare -a names      # 存放名字的數(shù)組
      hello="hello"         # 打招呼的用語(yǔ)
      end="!"               # 結(jié)束的內(nèi)容
      tittle=off            # 是否首字母大寫
      # 解析選項(xiàng)
      while getopts :n:h:e:t opt
      do
          case "$opt" in
              n) defaultname="$OPTARG" ;;
              h) hello="$OPTARG" ;;
              e) end="$OPTARG" ;;
              t) tittle=on ;;
              :)  # 沒有為需要參數(shù)的選項(xiàng)指定參數(shù)
                  echo "This option -$OPTARG requires an argument."
                  exit 1 ;;
              ?) # 發(fā)現(xiàn)了無效的選項(xiàng)
                  echo "-$OPTARG is not an option"
                  exit 2 ;;
          esac
      done
      # 解析參數(shù)
      shift $[ $OPTIND -1 ]  # 移動(dòng)到第一個(gè)參數(shù)的位置
      # 這次用for循環(huán)遍歷
      for arg in "$@"
      do
          names=("${names[@]}" "$arg")
      done
      names[0]=${names[0]:-$defaultname}
      for name in "${names[@]}"
      do
          [ "$tittle" = on ] && output="${hello^} ${name^} $end" || output="$hello $name $end"
          echo "${output}"
      done
      $ 

      驗(yàn)證執(zhí)行如下:

      $ ./say_hello.sh 
      hello nobody !
      $ ./say_hello.sh -n adam
      hello adam !
      $ ./say_hello.sh -n adam -h hi -e. -t
      Hi Adam .
      $ ./say_hello.sh -h hi -e. -t adam bob clark
      Hi Adam .
      Hi Bob .
      Hi Clark .
      $ ./say_hello.sh -a -h hi -e. -t adam bob clark
      -a is not an option
      $ ./say_hello.sh -h
      This option -h requires an argument.
      $ 

      選項(xiàng)和參數(shù)不能混排:

      $ ./say_hello.sh adam
      hello adam !
      $ ./say_hello.sh adam -t
      hello adam !
      hello -t !
      $ 

      支持雙破折線:

      $ ./say_hello.sh -t adam
      Hello Adam !
      $ ./say_hello.sh -t -- adam
      Hello Adam !
      $ 

      比較下來,使用起來會(huì)比getopt方便很多,不過功能上也差了很多,可選參數(shù)(雙冒號(hào)::)應(yīng)該也是不支持的。另外,如果熟悉getopt的話,每一步的操作都是自己的代碼控制的。而getopts就簡(jiǎn)化了很多地方,比如不會(huì)調(diào)用shift移動(dòng)變量。

      將選項(xiàng)標(biāo)準(zhǔn)化

      有些字母選項(xiàng)在Linux世界里已經(jīng)有了某種程度的標(biāo)準(zhǔn)含義。如果在shell腳本中支持這些選項(xiàng),就應(yīng)該使用標(biāo)準(zhǔn)的字母來定義。
      下面是一些命令行選項(xiàng)中經(jīng)常會(huì)用到的選項(xiàng)和含義:
      選項(xiàng)描述
      -a 顯示所有對(duì)象(顯示隱藏)
      -c 生成一個(gè)計(jì)數(shù)
      -d 指定一個(gè)目錄
      -e 擴(kuò)展一個(gè)對(duì)象
      -f 指定讀入數(shù)據(jù)的文件
      -h 顯示命令的幫助信息
      -i 忽略文本大小寫
      -l 產(chǎn)生輸出的長(zhǎng)格式版本
      -n 使用非交互模式(批處理)
      -o 將所有輸出重定向到指定的輸出文件
      -q 以安靜模式運(yùn)行
      -r 遞歸地處理目錄和文件
      -s 以安靜模式運(yùn)行
      -v 生成詳細(xì)輸出
      -x 排除某個(gè)對(duì)象
      -y 對(duì)所有問題回答yes

      網(wǎng)站題目:shell命令行參數(shù)(getopt和getopts)
      轉(zhuǎn)載來于:http://www.ef60e0e.cn/article/jdoghi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        乐清市| 平邑县| 皮山县| 迁西县| 齐河县| 吐鲁番市| 田阳县| 冕宁县| 体育| 乌兰县| 行唐县| 乌兰察布市| 英吉沙县| 渭源县| 普洱| 灵宝市| 泌阳县| 河池市| 汉源县| 桂阳县| 卢龙县| 阿尔山市| 沂源县| 习水县| 云安县| 天等县| 余干县| 普陀区| 莲花县| 莆田市| 黄骅市| 兖州市| 拉萨市| 临湘市| 泰来县| 静宁县| 灌云县| 广饶县| 叶城县| 南宫市| 上栗县|