Shell腳本中使用getopts處理多命令行選項(xiàng)
在Linux系統(tǒng)中,許多命令都提供了選項(xiàng),使用不同的選項(xiàng)就會得到不通的執(zhí)行結(jié)果
例如:ls命令,ls命令提供了多個選項(xiàng):-l、-a、-A、-h、-i等等,每個選項(xiàng)具有不同的功能,我們自己寫腳本時也可以定義選項(xiàng),提示用戶如何使用,本文介紹如何使用getopts命令來處理命令選項(xiàng)。
1.getopts命令的如何使用:
用getopts命令獲取到腳本選項(xiàng)后,getopts會將獲取到的選項(xiàng)所對應(yīng)的參數(shù)(選項(xiàng)對應(yīng)的參數(shù),并不是選項(xiàng)本身,有的命令選項(xiàng)后面是需要跟一個參數(shù)的,例如tcpdump 的-w選項(xiàng),后面需要指定一個文件來保存抓包數(shù)據(jù))自動保存到OPTARG這個變量中。
getopts命令格式:getopts OPTSTRING VARNAME
- OPTSTRING:告訴getopts會有哪些選項(xiàng)和參數(shù)(用選項(xiàng)后面加“:”來表示選項(xiàng)后面需要加參數(shù))
- VARNAME:保存getopts獲取到的選項(xiàng)
示例:getopts ahf: var
告訴getopts查找-a、-h、-f選項(xiàng),其中f選項(xiàng)后面需要跟一個參數(shù),獲取到的選項(xiàng)都保存到變量var中
getopts命令支持兩種錯誤報告模式,詳細(xì)錯誤報告模式和抑制錯誤報告模式。
在詳細(xì)錯誤報告模式下:如果getopts檢測到一個無效的選項(xiàng),var的值會被設(shè)置為(?);如果getopts檢測到一個后面需要跟參數(shù)的選項(xiàng),后面沒有參數(shù),var的值也會被設(shè)置為(?)
在抑制錯誤報告模式下:如果getopts檢測到一個無效的選項(xiàng),var的值會被設(shè)置為(?),變量OPTARG會被設(shè)置為這個無效的選項(xiàng);如果getopts檢測到一個后面需要跟參數(shù)的選項(xiàng),后面沒有參數(shù),var的值會被設(shè)置為(:),變量OPTARG會被設(shè)置為這個無效的選項(xiàng)
2.通過腳本來講解getopts如何獲取選項(xiàng),如何賦值給變量VARNAME和OPTSTRING:
示例:
#!/bin/bash
status=off #定義變量status,初始值設(shè)置為off
filename="" #定義變量filename,用于保存選項(xiàng)參數(shù)(文件)
output="" #定義變量output,用于保存選項(xiàng)參數(shù)(目錄)
Usage () { #定義函數(shù)Usage,輸出腳本使用方法
echo "Usage"
echo "myscript [-h] [-v] [-f <filename>] [-o <filename>]"
exit -1
}
while getopts :hvf:o: varname #告訴getopts此腳本有-h、-v、-f、-o四個選項(xiàng),-f和-o后面需要跟參數(shù)
(沒有選項(xiàng)時,getopts會設(shè)置一個退出狀態(tài)FALSE,退出循環(huán))
do
case $varname in
h)
echo "$varname"
Usage
exit
;;
v)
echo "$varname"
status=on
echo "$status"
exit
;;
f)
echo "$varname"
echo "$OPTARG"
filename=$OPTARG #將選項(xiàng)的參數(shù)賦值給filename
if [ ! -f $filename ];then #判斷選項(xiàng)所跟的參數(shù)是否存在且是文件
echo "the source file $filename not exist!"
exit
fi
;;
o)
echo "$varname"
echo "$OPTARG"
output=$OPTARG #將選項(xiàng)參數(shù)賦值給output
if [ ! -d $output ];then #判斷選項(xiàng)參數(shù)是否存在且是目錄
echo "the output path $output not exist"
exit
fi
;;
:) #當(dāng)選項(xiàng)后面沒有參數(shù)時,varname的值被設(shè)置為(:),OPTARG的值被設(shè)置為選項(xiàng)本身
echo "$varname"
echo "the option -$OPTARG require an arguement" #提示用戶此選項(xiàng)后面需要一個參數(shù)
exit 1
;;
?) #當(dāng)選項(xiàng)不匹配時,varname的值被設(shè)置為(?),OPTARG的值被設(shè)置為選項(xiàng)本身
echo "$varname"
echo "Invaild option: -$OPTARG" #提示用戶此選項(xiàng)無效
Usage
exit 2
;;
esac
done


總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Linux下的自動化構(gòu)建工具之make/makefile的用法詳解
這篇文章主要為大家詳細(xì)介紹了Linux下的自動化構(gòu)建工具之make/makefile的區(qū)別與使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-10-10
linux定時備份MySQL數(shù)據(jù)庫并刪除以前的備份文件(推薦)
這篇文章主要介紹了linux定時備份MySQL數(shù)據(jù)庫并刪除以前的備份文件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01
Shell $?獲取函數(shù)返回值或者上一個命令的退出狀態(tài)
這篇文章主要介紹了Shell $?獲取函數(shù)返回值或者上一個命令的退出狀態(tài),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
linux shell實(shí)現(xiàn)批量主機(jī)遠(yuǎn)程執(zhí)行命令腳本
這篇文章主要介紹了linux shell實(shí)現(xiàn)批量主機(jī)遠(yuǎn)程執(zhí)行命令腳本,文章通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-09-09
Linux Shell腳本系列教程(六):數(shù)組和關(guān)聯(lián)數(shù)組
這篇文章主要介紹了Linux Shell腳本系列教程(六):數(shù)組和關(guān)聯(lián)數(shù)組,本文講解了什么是數(shù)組和關(guān)聯(lián)數(shù)組、定義打印普通數(shù)組、定義打印關(guān)聯(lián)數(shù)組等內(nèi)容,需要的朋友可以參考下2015-06-06
Shell腳本實(shí)現(xiàn)監(jiān)測文件變化的示例詳解
這篇文章主要和大家分享一個Shell腳本,可以實(shí)現(xiàn)監(jiān)測文件變化功能。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06

