Linux系統(tǒng)的Shell腳本傳參(bash)2022-08-25

Shell傳參快速使用腳本

  • 簡便版
input="$1"
echo ${input}
  • 進階版
getopt方法
ARGS=$(getopt -a -o i:t::h -l input:,test::,help -- "$@")
eval set -- "${ARGS}"
#help function
function usage() {
echo -e "OPTIONS:\n-i|--input:\t input value"
echo -e "-t|--test:\t Test value"
echo -e "-h|--help:\t Usage information"
echo -e "-o|--output:\t Output value"
exit 1
}
#get value
while true
do

    case "$1" in
        -i|--input)
            input="$2"
            shift
            ;;
        -t|--test)
            test="$2"
            ;;
        -o|--output)
            output="true"
            ;;
        -h|--help)
            usage
            ;;
        --)
            shift
            echo -e "\nUnused option(s): $@"
            break
            ;;
    esac
shift
done
#default value
test=${test:="test0"}
output=${output:="false"}

echo 'Input value:'$input
echo 'Test value:'$test
echo 'Output value:'$output
getopts方法
#default value
input='0'
test=${test:="test0"}
output=${output:="false"}
#help function
function usage() {
echo -e "OPTIONS:\n-i|--input:\t input value"
echo -e "-t|--test:\t Test value"
echo -e "-h|--help:\t Usage information"
echo -e "-o|--output:\t Output value"
exit 1
}
#get value
while getopts :i:t::ho opt
do
    case "$opt" in
        i) input="$OPTARG" ;;
        t) test="$OPTARG" ;;
        h) usage ;;
        o) output="true" ;;
        :) echo "This option -$OPTARG requires an argument."
           exit 1 ;;
        ?) echo "-$OPTARG is not an option"
           exit 2 ;;
    esac
done

echo 'Input value:'$input
echo 'Test value:'$test
echo 'Output value:'$output

做生信一般都繞不開Shell腳本編寫,如果腳本可以傳參就能實現(xiàn)大批量任務(wù)投遞饰剥,而且也可以通過傳參把相關(guān)流程封裝起來忠荞,相當(dāng)于與一個包或模塊蒋歌,用起來也比較方便。然而Shell腳本又不像R和Python等語言委煤,有現(xiàn)成包或模塊可以簡單快速實現(xiàn)傳參(我之前寫了R語言和Python傳參的文章堂油,感興趣可以點進去看一下。)碧绞,不過其實Shell傳參也沒有特別復(fù)雜府框,簡單學(xué)習(xí)一下也能快速上手。最簡單的傳參就是使用$1头遭,$2這種形式寓免,分別代表第一個和第二個參數(shù),但是如果參數(shù)多起來就不太方便了计维,還是有名字的參數(shù)比較方便袜香。

getopt與getopts簡介

getoptgetopts都是Shell自帶的命令行參數(shù)解析工具,應(yīng)該就類似于awksed工具鲫惶,但兩者用法稍有不同蜈首,前者能實現(xiàn)更多功能,例如支持長名稱欠母,而后者不支持欢策,但getopts使用起來稍微簡單些,不用使用shift命令赏淌,更詳細的內(nèi)容看一查看這篇博客踩寇。


getopt傳參

getopt可以在命令行直接使用

getopt --alternative a: -a test

--alternative表示允許長名稱,可簡寫為-a六水,--option(-o)后面接短名稱俺孙,--long(-l)后面接長名稱。短名稱由單個字母和0-2個冒號組成掷贾,例如i睛榄,i:,i::想帅,如果只有冒號沒有字母场靴,表示如果不指定選項傳參的情況出現(xiàn),忽略錯誤,短名稱與冒號組合后直接寫到一起旨剥,例如i:t::ho咧欣,對應(yīng)的長名稱要按順序并且冒號數(shù)目要對應(yīng),并以逗號分隔泞边。--表示后面的內(nèi)容都會視為一個輸入?yún)?shù)该押。

  • 參數(shù)后面冒號個數(shù)的含義:0個表示不接受參數(shù),1個表示必須接受參數(shù)阵谚,2個表示可接也可不接受參數(shù)蚕礼。注意2個冒號的可選參數(shù)如果要傳參需要寫成-ttest形式,寫成-t test或-t=test都不行梢什。
在腳本中使用getopt
  • 第一步奠蹬,首先,構(gòu)建參數(shù)變量嗡午,使用getopt先定義參數(shù)囤躁,然后獲取外部參數(shù)數(shù)組傳給變量ARGS。$@表示傳入的所有參數(shù)荔睹。
ARGS=$(getopt --alternative --option :i:t::ho --long :input:,test::,help,output -- "$@")
eval set -- "${ARGS}"

set命令可以模擬傳參過程狸演,用法是set -- $(getopt a "$@"),相當(dāng)于把getopt從命令行獲取產(chǎn)出處理后的結(jié)果傳給set僻他,但由于是二次處理的參數(shù)結(jié)果宵距,如果出現(xiàn)復(fù)雜的參數(shù)(例如有空格的參數(shù))就會出現(xiàn)問題,因此需要eval命令把后面的內(nèi)容作為單個命令讀取和執(zhí)行吨拗。

  • 第二步满哪,構(gòu)建幫助信息函數(shù)
function usage() {
echo -e "OPTIONS:\n-i|--input:\t input value"
echo -e "-t|--test:\t Test value"
echo -e "-h|--help:\t Usage information"
echo -e "-o|--output:\t Output value"
exit 1
}
  • 第三步,獲取參數(shù)值
    shift命令可以把第一個參數(shù)去電劝篷,使得第二個參數(shù)變成第一個參數(shù)哨鸭,以此類推。因此娇妓,可以通過shift函數(shù)結(jié)合while循環(huán)逐個獲取參數(shù)像鸡。
while true
do

    case "$1" in
        -i|--input)
            input="$2"
            shift
            ;;
        -t|--test)
            test="$2"
            ;;
        -o|--output)
            output="true"
            ;;
        -h|--help)
            usage
            ;;
        --)
            shift
            echo -e "\nUnused option(s): $@"
            break
            ;;
    esac
shift
done
  • 第四步,設(shè)置默認值
    這里的邏輯是先檢測變量是否為空哈恰,如果為空則賦默認值坟桅,使用:=實現(xiàn)給變量設(shè)置默認值可以查看這篇博客
    當(dāng)然蕊蝗,其實也可以先在上述循環(huán)前直接給變量賦值。
test=${test:="test0"}
output=${output:="false"}

示例1

test.sh內(nèi)容

ARGS=$(getopt --alternative --option :i:t::ho --long :input:,test::,help,output -- "$@")
#ARGS=$(getopt -a -o i:t::h -l input:,test::,help -- "$@")
eval set -- "${ARGS}"

function usage() {
echo -e "OPTIONS:\n-i|--input:\t input value"
echo -e "-t|--test:\t Test value"
echo -e "-h|--help:\t Usage information"
echo -e "-o|--output:\t Output value"
exit 1
}

while true
do

    case "$1" in
        -i|--input)
            input="$2"
            shift
            ;;
        -t|--test)
            test="$2"
            ;;
        -o|--output)
            output="true"
            ;;
        -h|--help)
            usage
            ;;
        --)
            shift
            echo -e "\nUnused option(s): $@"
            break
            ;;
    esac
shift
done
test=${test:="test0"}
output=${output:="false"}

echo 'Input value:'$input
echo 'Test value:'$test
echo 'Output value:'$output

運行腳本

 ~ $ sh test.sh -h
OPTIONS:
-i|--input:      input value
-t|--test:       Test value
-h|--help:       Usage information
-o|--output:     Output value
 ~ $ sh test.sh -i 1

Unused option(s):
Input value:1
Test value:test0
Output value:false
 ~ $ sh test.sh -i 1 -ttest1

Unused option(s):
Input value:1
Test value:test1
Output value:false

getopts傳參

getopts只支持短名稱選項赖舟,但不需要額外的命令操作就能獲取參數(shù)蓬戚,其涉及3個變量:

OPTIND: 存放下一個要處理的參數(shù)的索引。這是 getopts 在調(diào)用過程中記住自己狀態(tài)的方式宾抓。
OPTARG: 由 getopts 找到的選項所對應(yīng)的參數(shù)子漩。
OPTERR: 值為0或1豫喧。指示Bash是否應(yīng)該顯示由 getopts 產(chǎn)生的錯誤信息。
其它步驟與上述內(nèi)容相同幢泼,只有解析參數(shù)的循環(huán)不一樣紧显,相較而言簡單很多,不用使用shift缕棵,而是直接使用變量OPTARG孵班。

while getopts :i:t::ho opt
do
    case "$opt" in
        i) input="$OPTARG" ;;
        t) test="$OPTARG" ;;
        h) usage ;;
        o) output="true" ;;
        :) echo "This option -$OPTARG requires an argument."
           exit 1 ;;
        ?) echo "-$OPTARG is not an option"
           exit 2 ;;
    esac
done

示例2

test1.sh內(nèi)容

input='0'
test=${test:="test0"}
output=${output:="false"}
function usage() {
echo -e "OPTIONS:\n-i|--input:\t input value"
echo -e "-t|--test:\t Test value"
echo -e "-h|--help:\t Usage information"
echo -e "-o|--output:\t Output value"
exit 1
}


while getopts :i:t::ho opt
do
    case "$opt" in
        i) input="$OPTARG" ;;
        t) test="$OPTARG" ;;
        h) usage ;;
        o) output="true" ;;
        :) echo "This option -$OPTARG requires an argument."
           exit 1 ;;
        ?) echo "-$OPTARG is not an option"
           exit 2 ;;
    esac
done

echo 'Input value:'$input
echo 'Test value:'$test
echo 'Output value:'$output

運行腳本

 ~ $ sh test1.sh -h
OPTIONS:
-i|--input:      input value
-t|--test:       Test value
-h|--help:       Usage information
-o|--output:     Output value
 ~ $ sh test1.sh -i 1
Input value:1
Test value:test0
Output value:false
 ~ $ sh test1.sh -i 1 -ttest1 -o
Input value:1
Test value:test1
Output value:true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市招驴,隨后出現(xiàn)的幾起案子篙程,更是在濱河造成了極大的恐慌,老刑警劉巖别厘,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虱饿,死亡現(xiàn)場離奇詭異,居然都是意外死亡触趴,警方通過查閱死者的電腦和手機氮发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冗懦,“玉大人爽冕,你說我怎么就攤上這事∨” “怎么了扇售?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚣艇。 經(jīng)常有香客問我承冰,道長,這世上最難降的妖魔是什么食零? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任困乒,我火速辦了婚禮,結(jié)果婚禮上贰谣,老公的妹妹穿的比我還像新娘娜搂。我一直安慰自己,他們只是感情好吱抚,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布百宇。 她就那樣靜靜地躺著,像睡著了一般秘豹。 火紅的嫁衣襯著肌膚如雪携御。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音啄刹,去河邊找鬼涮坐。 笑死,一個胖子當(dāng)著我的面吹牛誓军,可吹牛的內(nèi)容都是我干的袱讹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼昵时,長吁一口氣:“原來是場噩夢啊……” “哼捷雕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起债查,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤非区,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盹廷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體征绸,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年俄占,在試婚紗的時候發(fā)現(xiàn)自己被綠了管怠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缸榄,死狀恐怖渤弛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甚带,我是刑警寧澤她肯,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鹰贵,受9級特大地震影響晴氨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碉输,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一籽前、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敷钾,春花似錦枝哄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侨赡,卻和暖如春瘪贱,著一層夾襖步出監(jiān)牢的瞬間纱控,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工菜秦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舶掖。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓球昨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眨攘。 傳聞我的和親對象是個殘疾皇子主慰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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