1. 程式人生 > >shell指令碼中如何獲取命令的引數(2) ----處理命令引數

shell指令碼中如何獲取命令的引數(2) ----處理命令引數


 1    找出選項

    1.1 處理簡單選項

            主要可以通過shfit工具對獲取的到$1變數對比程式允許的變數值判斷;

  1.2  從引數中分離選項

   一般引數可能在後面跟上適當的引數值,例如 sed   -f script  data

所有如何把選項的引數與選項有效的分隔開也是一種很重要的技能,我們可以限制命令後面的規定格式,雖然沒有很大的靈活性,但是它卻解決了我們的問題,在linux當中用(--)這個特殊字元來表示選項的結束,引數項開始

下面進階一點,討論一下如何獲取帶值的選項

1.3 處理帶值的選項

這個步驟主要是讓我們指令碼能夠處理形如:./test   -a test1 -b -c -d test2

這就得要求指令碼呢必須能夠檢測命令列選項合適需要附加引數,並能夠進行處理,下面的例子可以很好展示如何解決這類問題;

2 使用命令

getopt命令可以接受任意形式的命令列引數,在處理命令列選項和引數時非常方便

命令格式: getopt options optstring parameters    

其中選項字串是處理的關鍵,它定義命令列中有效選項字母,它還定義哪些選項字母需要引數值

首先,在選項字串中列出將在指令碼中用到的每個命令列選項字母。然後,在每個需要引數值的選項字母后面放置一個冒號。getopt命令根據定義的選項字串解析提供的引數

請看下面的getopt示例:

$ getopt  ab:cd  -a -b test1 -cd test2 test3

 -a -b test1 -c -d -- test2 test3

$

可見經過getopt的處理得到了規整的引數列表,注意它自動的把-cd 分為-c ,-d ,並插入破折號來分隔行中額外的引數

如果提供的引數不在optstring當中,getopt會給予提示出錯資訊

[email protected]:~/sh$ getopt ab:cd -a -b test1 -e -cd test2 test3
getopt:無效選項 -- e
 -a -b test1 -c -d -- test2 test3
[email protected]:~/sh$

如果希望忽略這個錯誤資訊,可以在命令中使用-q選項

[email protected]:~/sh$ getopt -q ab:cd -a -b test1 -e -cd test2 test3
 -a -b 'test1' -c -d -- 'test2' 'test3'
[email protected]:~/sh$

現在介紹如何在指令碼中使用getopt

這裡存在一個技巧

set命令的一個選項是雙破折號,表示將命令列引數變數替換為set命令的命令列中的值

set  --  `getopt -q ab:cd "[email protected]"`

按照上面的技巧我們試著編寫一個:

jiang[email protected]:~/sh$ cat test60.sh
#!/bin/bash
set -- `getopt -q  ab:c  "[email protected]"`
while [ -n "$1" ]
do 
	case "$1" in
	-a) echo "Found the -a option";;
	-b) param="$2"
		echo "Found the -b option with parameter value $param"
		shift ;;
	-c) echo "Found the -c option";;
	--) shift
            break;;
	*) echo "$1 is not option "
	esac
	shift
done

count=1
for param in "[email protected]"
do 
	echo "Parameter #$count:$param"
	count=$[$count + 1]
done
[email protected]:~/sh$ ./test60.sh -a -b test10 -c -d 1 2 3 
Found the -a option
Found the -b option with parameter value 'test10'
Found the -c option
Parameter #1:'1'
Parameter #2:'2'
Parameter #3:'3'
[email protected]:~/sh$ 


getopts命令

不同於getopt,getopts每次獲取引數列表當中的一個合法項,當處理完最後的即返回一個大於0 的退出狀態

格式:getopts   optstring  variable

optstring和getopt大致相同,主要區別在與禁止輸出錯誤資訊,這裡直接在optstring前面加一個冒號:

其中每次返回的值存放在variable當中,可以用於for迴圈當中迭代,getopts當中使用兩個環境變數,環境變數OPTARG中包含需要引數值選項要使用的值,環境變數OPTIND 包含的值表示getopts停止處理時在引數列表中的位置,這樣,處理完選項後可以繼續處理其他命令列引數。

[email protected]:~/sh$ cat test61.sh
#!/bin/bash

while getopts :ab:c  opt
do
	case "$opt" in 
	a) echo "Found -a option";;
	b) echo "Found -b option,with value $OPTARG";;
	c) echo "Found -c option";;
	*) echo "$opt is unknown option";;
	esac
done
[email protected]:~/sh$ ./test61.sh -a -b test1 -c
Found -a option
Found -b option,with value test1
Found -c option
[email protected]:~/sh$ 

必須注意上面的case選項中不在包括(-)

getopts會自動處理未定義的引數

[email protected]:~/sh$ ./test61.sh -a -b test1 -c -d
Found -a option
Found -b option,with value test1
Found -c option
? is unknown option
[email protected]:~/sh$ 


另外getopts知道合適停止處理選項,將引數選項交給您處理。getopts每個處理選項,環境變數OPTIND的值都會增加1,當達到getopts處理的末尾時,可以使用shift命令和OPTIND值進行操作來移動到引數;

例項如下:

[email protected]:~/sh$ cat test62.sh
#!/bin/bash
while    getopts :ab:cd opt 
do
	case "$opt" in 
	a) echo "Found the -a option";;
	b) echo "Found the -b option,with vale $OPTARG";;
	c) echo "Found the -c option";;
	d)echo "Found the -d option";;
	*)echo "$1 is not an option";;
	esac
done
shift $[$OPTIND - 1]
count=1
for parameter in [email protected]
do
	echo "Patameter #$count:$parameter"
	count=$[$count + 1]
done
[email protected]:~/sh$ ./test62.sh -a -b test1 -c -d 1 2 3 4
Found the -a option
Found the -b option,with vale test1
Found the -c option
Found the -d option
Patameter #1:1
Patameter #2:2
Patameter #3:3
Patameter #4:4
[email protected]:~/sh$ 


相關推薦

shell指令碼如何獲取命令引數2 ----處理命令引數

 1    找出選項     1.1 處理簡單選項             主要可以通過shfit工具對獲取的到$1變數對比程式允許的變數值判斷;   1.2  從引數中分離選項    一般

shell 指令碼獲取命令的輸出

這個主要介紹的方法是獲取命令的輸出內容,而不是命令執行成功與否的返回值。 通常情況下,在shell指令碼中需要獲取命令的輸出內容,然後根據輸出內容判斷下一步的執行操作。 比較常用的一種方式就是, 匹配命令輸出的內容中是否存在某些關鍵字,選擇執行的不同動作。 比較常用的一種方式就是

shell 指令碼獲取執行系統命令的輸出結果

這個主要介紹的方法是獲取命令的輸出內容,而不是命令執行成功與否的返回值。通常情況下,在shell指令碼中需要獲取命令的輸出內容,然後根據輸出內容判斷下一步的執行操作。比較常用的一種方式就是, 匹配命令輸出的內容中是否存在某些關鍵字,選擇執行的不同動作。比較常用的一種方式就是採

Linux真小白入門教程第五集——Bash Shell命令學習2

shell還提供了很多在Linux檔案系統上操作檔案的命令 touch命令可以輕鬆建立空檔案。 touch test_one 建立新檔案,並將你的使用者名稱作為檔案的屬主,此時檔案的大小為0,因為touch命令只建立了一個空檔案。   cp命令可以完成檔案的複製操作

在C++調用DLL的函數2

釋放 工作 img .html 一個 log ++ 原型 獲取 轉自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 應用程序使用DLL可以采用兩種方式: 一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要

2nload命令、監控io性能、free命令、ps命令 、netstat查看網絡狀態

netstat查看網絡狀態 nload命令(查看網卡流量,與sar -n DEV)(系統默認是沒安裝這個工具包的,yum install -y nload,安裝nload前安裝epel-release)使用nload查看網卡信息,可以看到進出使用網卡的信息,按q鍵退出。

痞子衡嵌入式:極精簡的Git命令教程2- 連接(remote/clone)

我們 pair ssh key 技術 彈出 change 能夠 sha2 permanent   今天是Git系列課程第二課,上一課我們已經學會在本地創建一個空repo,痞子衡今天要講的是如何將本地倉庫與遠程建立聯系。 1.將本地倉庫掛上遠程git remote   本地

git命令2

git 命令行一、父提交的表示方法 1.HEAD引用 在.git/HEAD目錄下存在一個HEAD文件,其記錄著當前工作區對應的SHA1。如果當前工作區從某個分支檢出(checkout),那麽這個HEAD文件中的引用最終執行分支對應的SHA1,如果處於分離頭狀態(不對應分支,從某個commit檢查),那麽這個H

[JavaScript]JavaScript的函數2

ron 總結 href 尋找 tro http cal con 如果 承接上一篇博文的總結,這篇博文是利用代碼+畫圖的形式,梳理一下對於函數作用域和閉包的理解。 函數中的作用域 在 JavaScript 中, 對象和函數同樣也是變量。 在 JavaScript 中, 作用

EF Core 2.1 的新增功能2

版本兼容 strong 名稱 col console 功能 開頭 install target 安裝 EF Core 將 EF Core 添加到不同平臺和常用 IDE 中的應用程序的所需步驟匯總。 分步入門教程 無需具備 Entity Framework Core 或任何特

【原創】命令2----一些伺服器命令

      Ls Ps –x Cd server/ Sh stopall.sh Sh fresh.sh Sh runall.sh       命令全部小寫即可   Ls

西遊之路——python全棧——djangoorm的使用2 python---djangoorm的使用1

目錄   1.基於物件的正向查詢和反向查詢 在python---django中orm的使用(1)中也提到了正向和反向查詢 表:一對多  書籍和出版社 1 class Book(models.Model): 2 title

大資料linux系統部分命令解析20912

1.檢視ip ifconfig 解釋: ifconfig 常用命令關閉網絡卡,檢視ip。請看幫助! NAME ifconfig - configure a network interface SYNOPSIS ifconf

find 命令使用2

find 查詢命令 -size 查詢指定檔案的大小;大於+100M(K,M,G);-100小於;100 等於 -mtime 指定時間查詢;+5是5天前的;-5是5天后的;5第5天

grep 命令使用2

grep 引數-w 精準匹配查詢的內容並輸出所在行 [[email protected] scripts]#cat sedtext qwerrrr wewq wew1 erw wew [[email protected] scripts]#grep "wew" sedtext

sed 命令使用2

1、sed 命令的後項要引用取IP [[email protected] scripts]# ifconfig enp0s3|grep 'inet '|sed -r 's#.*inet (.*) netmask.*$#\1#g' 192.168.0.3 [[email pro

Linux的許可權介紹2-預設許可權umask-永久和臨時修改

預設許可權–umask 檢視當前使用者建立檔案或目錄的預設許可權:umask 檢視當前被拿走的許可權 [[email protected] ~]# umask 0022 0022 第一個0表示是檔案或目錄的特殊許可權 第二個0表示檔案或目錄的擁有者有所有的rwx許可權

執行shell指令碼的四種方式

原文網址:https://www.jb51.net/article/53924.htm 這篇文章主要介紹了Linux中執行shell指令碼的4種方法,即總結在Linux中執行shell指令碼的4種方法。 前提:bash shell 指令碼的方法有多種,現在作個小結。假設我們編寫好的shell指令碼的檔名為

REDIS五種基本資料型別命令操作2

REDIS 五種基本資料型別命令操作 1.set集合 sadd key v1 [v2 v3] # 新增值到set集合中 smembers key # 迭代遍歷set集合 sismember key value # 判斷是否存在一個

Shell指令碼學習指南讀書筆記

第1章 背景知識略 第2章 入門 編譯型語言 優點:高效 缺點:多半運作於底層,處理位元組、整數或其他機器層級的物件(C++中就很難將一個目錄所有檔案複製到另一個目錄中) 指令碼程式語言 通常是解釋型的