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


點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。
點(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ù)的腳本,不妨考慮本文。
推薦閱讀:
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!
