在執(zhí)行shell腳本的時(shí)候庙睡,會(huì)經(jīng)常遇到需要向shell腳本傳遞參數(shù)的情況著角。即是對(duì)命令行選項(xiàng)揪漩、參數(shù)處理的方式。例如:
./test.sh -f config.conf -v --prefix=/home
-f 為短選項(xiàng)吏口,需要一個(gè)參數(shù)奄容,即config.conf。-v也是一個(gè)選項(xiàng)产徊,但不需要參數(shù)昂勒。--prefix 是一個(gè)長(zhǎng)選項(xiàng),即選項(xiàng)本身多于一個(gè)字符舟铜,它也需要一個(gè)參數(shù)戈盈,用等號(hào)連接,等號(hào)不是必須的深滚。
shell腳本的命令行選項(xiàng)奕谭、參數(shù)處理主要有三種方式。
- 手工處理方式
- getopts
- getopt
getopt與getopts對(duì)比
shell中g(shù)etopt和getopts命令
getopts是shell內(nèi)建命令痴荐,getopt是獨(dú)立外部工具血柳。
getopts不支持長(zhǎng)參數(shù)(如 --option),getopt支持
getopts語(yǔ)法簡(jiǎn)單生兆,getopt語(yǔ)法較復(fù)雜
getopts出現(xiàn)的目的是為了替代getopt較快捷的執(zhí)行參數(shù)分析工作
一难捌、shell手工處理
在手工處理方式中,首先要知道幾個(gè)變量鸦难,還是以上面的命令行為例:
參數(shù) | 說(shuō)明 |
---|---|
$0 | ./shell_manual_param.sh,即命令本身根吁,相當(dāng)于C/C++中的argv[0] |
2合蔽、 $3 | 分別為第一击敌、二、三個(gè)參數(shù)拴事,依此類推 |
$@ | 參數(shù)本身的列表沃斤,也不包括命令本身,"$@"是一個(gè)參數(shù)數(shù)組 |
$* | 和" 和 ""將所有的參數(shù)解釋成一個(gè)字符串 |
$# | 傳遞到腳本的參數(shù)個(gè)數(shù) |
1.1 如下例所示
echo "第一個(gè)參數(shù):$1"
echo "第二個(gè)參數(shù):$2"
echo "所有參數(shù)解析成一個(gè)字符串:"
for arg in "$*"
do
echo $arg
done
echo
echo "所有參數(shù)解析成參數(shù)數(shù)組:"
for arg in "$@"
do
echo $arg
done
二、getopts使用
getopts是一個(gè)解析腳本選項(xiàng)參數(shù)的工具牲证。
(1) 語(yǔ)法格式:getopts [option[:]] [DESCPRITION] VARIABLE
(2) option:表示為某個(gè)腳本可以使用的選項(xiàng).
(3) ":":如果某個(gè)選項(xiàng)(option)后面出現(xiàn)了冒號(hào)(":")哮针,則表示這個(gè)選項(xiàng)后面可以接參數(shù)(即一段描述信息DESCPRITION)
(4) VARIABLE:表示將某個(gè)選項(xiàng)保存在變量VARIABLE中
getopts是linux系統(tǒng)中的一個(gè)內(nèi)置變量,一般用在循環(huán)中。每當(dāng)執(zhí)行循環(huán)是十厢,getopts都會(huì)檢查下一個(gè)命令選項(xiàng)等太,如果這些選項(xiàng)出現(xiàn)在option中,則表示是合法選項(xiàng)寿烟,否則不是合法選項(xiàng)澈驼。并將這些合法選項(xiàng)保存在VARIABLE這個(gè)變量中。
getopts還包含兩個(gè)內(nèi)置變量筛武,及OPTARG和OPTIND:
- OPTARG:就是將選項(xiàng)后面的參數(shù)(或者描述信息DESCPRITION)保存在這個(gè)變量當(dāng)中。
- OPTIND:這個(gè)表示命令行的下一個(gè)選項(xiàng)或參數(shù)的索引(文件名不算選項(xiàng)或參數(shù))
getopts解析規(guī)則如下:
選項(xiàng)的使用定義規(guī)則類似 getopts :
例如
ab:c::
意思是:
a 后沒(méi)有冒號(hào)挎塌,表示沒(méi)有可以參數(shù)
b 后跟一個(gè)冒號(hào)徘六,表示有一個(gè)必要的參數(shù)
c 后跟兩個(gè)冒號(hào),表示有一個(gè)可選的參數(shù)(參數(shù)必須緊挨著選項(xiàng))</pre>
使用例子如下:
#!/bin/bash
echo "執(zhí)行請(qǐng)輸入以下參數(shù): 例如 -t "hello world""
# case榴都、in 和 esac 都是 Shell 關(guān)鍵字待锈,用于分支判斷
# 變量和等號(hào)之間不能有空格
# 2個(gè)命名參數(shù) t 和 h
# getopts不支持長(zhǎng)參數(shù)(如 --option)
TYPE=""
while getopts ":t:h:" OPT
do
case $OPT in
t)
TYPE="$OPTARG"
echo $OPTARG $OPTIND
echo "input parameter1: ${TYPE}"
;;
h)
TYPE="$OPTARG"
echo "input parameter2: ${TYPE}"
;;
esac
done
如上圖代碼和執(zhí)行結(jié)果所示:執(zhí)行腳本的時(shí)候,輸入2個(gè)命名選項(xiàng)嘴高,命名選項(xiàng)t的參數(shù)為“it's t parameter1”竿音,命名選項(xiàng)h的參數(shù)為“param2”。
https://wenku.baidu.com/view/cad9e7de0142a8956bec0975f46527d3250ca64d.html
三拴驮、getopt使用
語(yǔ)法:
getopt [options] -o|--options <optstring> [options] [--] <parameters>
選項(xiàng):
選項(xiàng) | 說(shuō)明 | |
---|---|---|
-a | --alternative | 允許長(zhǎng)選項(xiàng)以 - 開(kāi)始 |
-h | --help | 幫助春瞬,用法指南 |
-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 | 無(wú)正常輸出 |
-s | --shell <shell> | 設(shè)置 shell 引用規(guī)則 |
使用例子:
#/bin/bash
set -- $(getopt ab:cd "$@")
# -n指令判空
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option";;
-b) par="$2"
echo "Found the -b option,par = $par"
shift;;
-c) par="$3"
echo "Found the -c option,par = $par";;
-d) echo "Found the -d option";;
# -- 代表到了選項(xiàng)尾部
--) shift
break ;;
*) echo "$1 is not option";;
esac
shift
done
count=1
for param in "$@"
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
b后面跟了一個(gè):符號(hào),這個(gè)符號(hào)的作用是代表這個(gè)選項(xiàng)是一個(gè)需要輸入值的選項(xiàng)憔恳。
set 作用解釋:要在腳本中使用getopt较雕。首先佩憾,要用getopt命令生成格式化后的版本來(lái)替換已有的命令行選項(xiàng)和參數(shù)。需要用到set命令萄涯。set命令能夠處理shell中的各種變量。set命令的雙破折線(--)選項(xiàng)唆鸡,效果是將命令行參數(shù)替換成set命令的參數(shù)值涝影。$@符號(hào)是代表輸入?yún)?shù)字符串。
shift作用:shift的特性是將參數(shù)向前挪移一步争占,如:2、$3燃乍,執(zhí)行一次shift指令之后會(huì)將2唆樊、3向前挪移,2變成1刻蟹,3變成2逗旁,而1會(huì)被丟棄。對(duì)于選項(xiàng)中有參數(shù)的,例如選項(xiàng)b片效,需要使用shift指令红伦。
執(zhí)行結(jié)果:
參考
https://linuxeye.com/389.html
https://blog.csdn.net/wh211212/article/details/53750366
https://www.shuzhiduo.com/A/obzbReLbzE/
https://blog.csdn.net/bjbz_cxy/article/details/124032986