執(zhí)行shell腳本傳遞參數(shù)的方式

在執(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]
1、2合蔽、 $3 分別為第一击敌、二、三個(gè)參數(shù)拴事,依此類推
$@ 參數(shù)本身的列表沃斤,也不包括命令本身,"$@"是一個(gè)參數(shù)數(shù)組
$* @相同刃宵,但"" 和 "@"(加引號(hào))并不同衡瓶,""將所有的參數(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
image.png

二、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
image.png

如上圖代碼和執(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ù)向前挪移一步争占,如:1燃逻、2、$3燃乍,執(zhí)行一次shift指令之后會(huì)將2唆樊、3向前挪移,2變成1刻蟹,3變成2逗旁,而1會(huì)被丟棄。對(duì)于選項(xiàng)中有參數(shù)的,例如選項(xiàng)b片效,需要使用shift指令红伦。

執(zhí)行結(jié)果:

image.png

參考

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淀衣,隨后出現(xiàn)的幾起案子昙读,更是在濱河造成了極大的恐慌,老刑警劉巖膨桥,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛮浑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡只嚣,警方通過(guò)查閱死者的電腦和手機(jī)沮稚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)册舞,“玉大人蕴掏,你說(shuō)我怎么就攤上這事〉骶ǎ” “怎么了盛杰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)藐石。 經(jīng)常有香客問(wèn)我即供,道長(zhǎng),這世上最難降的妖魔是什么贯钩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任募狂,我火速辦了婚禮,結(jié)果婚禮上角雷,老公的妹妹穿的比我還像新娘祸穷。我一直安慰自己,他們只是感情好勺三,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布雷滚。 她就那樣靜靜地躺著,像睡著了一般吗坚。 火紅的嫁衣襯著肌膚如雪祈远。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天商源,我揣著相機(jī)與錄音车份,去河邊找鬼。 笑死牡彻,一個(gè)胖子當(dāng)著我的面吹牛扫沼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缎除,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼严就!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起器罐,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梢为,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后轰坊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體铸董,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年衰倦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袒炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡樊零,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孽文,到底是詐尸還是另有隱情驻襟,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布芋哭,位于F島的核電站沉衣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏减牺。R本人自食惡果不足惜豌习,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拔疚。 院中可真熱鬧肥隆,春花似錦、人聲如沸稚失。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)句各。三九已至吸占,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凿宾,已是汗流浹背矾屯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留初厚,地道東北人件蚕。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骤坐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绪杏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容