shell指令碼中使用getops

2022-06-13 23:45:14 字數 4195 閱讀 6128

在linux系統中,許多命令都提供了選項,使用不同的選項就會得到不通的執行結果

例如:ls命令,ls命令提供了多個選項:-l、-a、-a、-h、-i等等,每個選項具有不同的功能,我們自己寫指令碼時也可以定義選項,提示使用者如何使用,本文介紹如何使用getopts命令來處理命令選項。

1.getopts命令的如何使用:

用getopts命令獲取到指令碼選項後,getopts會將獲取到的選項所對應的引數(選項對應的引數,並不是選項本身,有的命令選項後面是需要跟乙個引數的,例如tcpdump 的-w選項,後面需要指定乙個檔案來儲存抓包資料)自動儲存到optarg這個變數中。

getopts命令格式:getopts   optstring  varname

示例:getopts  ahf:   var

告訴getopts查詢-a、-h、-f選項,其中f選項後面需要跟乙個引數,獲取到的選項都儲存到變數var中

getopts命令支援兩種錯誤報告模式,詳細錯誤報告模式和抑制錯誤報告模式。

在詳細錯誤報告模式下:如果getopts檢測到乙個無效的選項,var的值會被設定為(?);如果getopts檢測到乙個後面需要跟引數的選項,後面沒有引數,var的值也會被設定為(?)

在抑制錯誤報告模式下:如果getopts檢測到乙個無效的選項,var的值會被設定為(?),變數optarg會被設定為這個無效的選項;如果getopts檢測到乙個後面需要跟引數的選項,後面沒有引數,var的值會被設定為(:),變數optarg會被設定為這個無效的選項

2.通過指令碼來講解getopts如何獲取選項,如何賦值給變數varname和optstring:

示例:?12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

4344

4546

4748

4950

5152

5354

55#!/bin/bash

status=off#定義變數status,初始值設定為off

filename=""#定義變數filename,用於儲存選項引數(檔案)

output=""#定義變數output,用於儲存選項引數(目錄)

usage ()

whilegetopts:hvf:o: varname#告訴getopts此指令碼有-h、-v、-f、-o四個選項,-f和-o後面需要跟引數

(沒有選項時,getopts會設定乙個退出狀態false,退出迴圈)

do

case$varnamein

h)

echo"$varname"

usage

exit

;;

v)

echo"$varname"

status=on

echo"$status"

exit

;;

f)

echo"$varname"

echo"$optarg"

filename=$optarg#將選項的引數賦值給filename

if[ ! -f $filename ];then#判斷選項所跟的引數是否存在且是檔案

echo"the source file $filename not exist!"

exit

fi

;;

o)

echo"$varname"

echo"$optarg"

output=$optarg#將選項引數賦值給output

if[ ! -d $output ];then#判斷選項引數是否存在且是目錄

echo"the output path $output not exist"

exit

fi

;;

:)#當選項後面沒有引數時,varname的值被設定為(:),optarg的值被設定為選項本身

echo"$varname"

echo"the option -$optarg require an arguement"#提示使用者此選項後面需要乙個引數

exit1

;;

?)#當選項不匹配時,varname的值被設定為(?),optarg的值被設定為選項本身

echo"$varname"

echo"invaild option: -$optarg"#提示使用者此選項無效

usage

exit2

;;

esac

done

總結

nodejs 中使用shell指令碼

雖然nodejs的require child process execsync可以使用shell,但其實問題特別多。尤其是符號和語法衝突,可讀性也很差,只能完成一些小規模的shell使用。const exec require child process execsync 執行,刪除.dist目錄下所...

nodejs 中使用shell指令碼

雖然nodejs的require child process execsync可以使用shell,但其實問題特別多。尤其是符號和語法衝突,可讀性也很差,只能完成一些小規模的shell使用。const exec require child process execsync 執行,刪除.dist目錄下所...

shell指令碼中使用while存在隱患

20170315uat 批量,在給零售通知書新增民生logo的作業中 發現執行報錯,但是指令碼繼續執行,並且排程圖上沒有反應報錯情況。經排查,發現shell指令碼中在使用的while語句用法存在著隱患,具體情況如下 cat file while read line do if ne 0 then e...