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之前首先要
十(2)nload命令、監控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全棧——django中orm的使用(2) python---django中orm的使用(1)
目錄 1.基於物件的正向查詢和反向查詢 在python---django中orm的使用(1)中也提到了正向和反向查詢 表:一對多 書籍和出版社 1 class Book(models.Model): 2 title
大資料linux系統部分命令解析(2)0912
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++中就很難將一個目錄所有檔案複製到另一個目錄中) 指令碼程式語言 通常是解釋型的