<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          這樣處理Shell腳本參數(shù),爽多了!

          共 1997字,需瀏覽 4分鐘

           ·

          2020-08-13 22:15


          點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。

          在《shell必備基礎(chǔ)知識》中說到了一些入口參數(shù)的基本使用:

          /home/shouwang/test.sh?para1?para2?para3
          $0??????????????????????$1????$2????$3
          腳本名??????????????第一個參數(shù)??????第三個參數(shù)

          有什么不方便之處?

          看到這里,你可能覺得沒什么,這不是學(xué)Shell都知道的知識嗎?

          但是你有沒有覺得這樣使用參數(shù)有這樣的問題

          • 要知道參數(shù)的順序,確定每一個位置的參數(shù)是什么含義

          • 不能隨意調(diào)換位置

          • 使用第三個參數(shù),必須要有第一個,第二個參數(shù)

          下面簡單示例說明一下。

          參數(shù)順序固定

          #!/usr/bin/env?bash
          #test.sh
          echo?"para1?$1"
          echo?"para2?$2"
          echo?"para3?$3"

          這個腳本程序很簡單,只是輸出第一二三個參數(shù):

          $?./test.sh?1?2?3
          para1?1
          para2?2
          para3?3

          你看,這樣para1對應(yīng)第一個參數(shù),如果位置調(diào)換了,就變了:

          $?./test?1?3?2
          para1?1
          para2?3
          para3?2

          只要順序一變,參數(shù)就對應(yīng)不上了。假設(shè)你有時候不需要第二個參數(shù),要使用第三個參數(shù),你是不是還必須得輸入第二個參數(shù)?

          優(yōu)雅地處理shell參數(shù)

          鋪墊了這么多,本文到底想介紹什么呢?

          實際上這種形式你已經(jīng)接觸過很多了。對于寫的程序,我已經(jīng)在《如何優(yōu)雅地處理命令行參數(shù)》中介紹過了,你在使用linux命令的時候想必也已經(jīng)領(lǐng)略了,例如:

          $?find?-name?"filename"

          用-name參數(shù)指定要查找的文件名,而不是說第一個參數(shù)是文件名,第二個參數(shù)是xxx。

          那么shell腳本如何像這樣將參數(shù)當(dāng)成選項來處理呢?實際上都是類似的,看下面的例子:

          #!/usr/bin/env?bash
          #?-n?名稱
          #?-a?作者
          #?-h?幫助
          while?getopts?":n:a:h"?optname
          do
          ????case?"$optname"?in
          ??????"n")
          ????????echo?"get?option?-n,value?is?$OPTARG"
          ????????;;
          ??????"q")
          ????????echo?"get?option?-a?,value?is?$OPTARG"
          ????????;;
          ??????"h")
          ????????echo?"get?option?-h,eg:./test.sh?-n?編程珠璣?-a?守望先生"
          ????????;;
          ??????":")
          ????????echo?"No?argument?value?for?option?$OPTARG"
          ????????;;
          ??????"?")
          ????????echo?"Unknown?option?$OPTARG"
          ????????;;
          ??????*)
          ????????echo?"Unknown?error?while?processing?options"
          ????????;;
          ????esac
          ????#echo?"option?index?is?$OPTIND"
          done

          解釋一下:

          • 有兩個預(yù)先定義的變量,OPTARG表示選項值,OPTIND表示參數(shù)索引位置,類似于前面提到$1。

          • n后面有:,表示該選項需要參數(shù),而h后面沒有:,表示不需要參數(shù)

          • 最開始的一個冒號,表示出現(xiàn)錯誤時保持靜默,并抑制正常的錯誤消息

          我們試一下效果:

          $?./test.sh?-a
          No?argument?value?for?option?a
          $?./test.sh?-h
          get?option?-h,eg:./test.sh?-n?編程珠璣?-a?守望先生
          $?./test.sh?-n?編程珠璣?-a?守望先生
          get?option?-a?,value?is?守望先生

          你看這樣使用參數(shù),不需要管參數(shù)的位置,并且參數(shù)還是可選,互不干擾。

          總結(jié)

          以這樣的方式處理參數(shù),使得腳本的參數(shù)擴(kuò)展性和可讀性都要好,對于支持豐富輸入?yún)?shù)的腳本,不妨考慮本文。

          良許個人微信


          添加良許個人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲??!

          推薦閱讀:

          編程界的十大天神,都來拜一拜吧

          虛擬內(nèi)存是什么?有什么用?

          到底是什么讓IT人如此苦逼???


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!


          瀏覽 83
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.日本一级在线 | 黑人内射精品 | 欧美色图一区在线视频 | 欧美大黑逼 | 成人在线三级片 |