日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell 命令行实现

發布時間:2025/7/25 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 命令行实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:原文網址http://blog.chinaunix.net/uid-26807463-id-3151601.html

獲取UNIX類型的選項:

  unix有一個優點就是標準UNIX命令在執行時都具有相同的命令行格式:

  command?-options?parameters

  如果在執行Shell程序也采用上述格式,Bourne?Shell中提供了一條獲取和處理命令行選項的語句,即getopts語句。該語句的格式為:

  getopts?option_string?variable

  其中option_string中包含一個有效的單字符選項。若getopts命令在命令行中發現了連字符,那么它將用連字符后面的字符同?option_string相比較。若有匹配,則把變量variable的值設為該選項。若無匹配,則variable設為?。當getopts發現連字符后面沒有字符,會返回一個非零的狀態值。Shell程序中可以利用getopts的返回值建立一個循環。

  有時侯選項中還帶一個值,getopts命令同樣也支持這一功能。這時需要在option_string中選項字母后加一個冒號。當?getopts命令發現冒號后,會從命令行該選項后讀取該值。若該值存在,那么將被存在一個特殊的變量OPTARG中。如果該值不存在,getopts命令將在OPTARG中存放一個問號,并且在標準錯誤輸出上顯示一條消息。

  optstring??option字符串,會逐個匹配

  varname?????每次匹配成功的選項

  arg?????????????參數列表,沒寫時它會取命令行參數列表

  $OPTIND?????特殊變量,option?index,會逐個遞增,?初始值為1

  $OPTARG????特殊變量,option?argument,不同情況下有不同的值

細則1
optstring”:“開頭時,getopts會區分invalid?option錯誤和miss?option?argument。?invalid?option錯誤時,varname會被設成?,$OPTARG是出問題的optionmiss?option?argument,varname會被設成:(在我的fedora系統里測試OPTARG?),$OPTARG是出問題的option.


optstring不以”:“開頭,invalid?option錯誤和miss?option?argument錯誤都會使varname被設成?,?$OPTARG是出問題的option(在我的fedora系統里測試OPTARG為空).

細則2
optstring中的字母跟”:“,表明該option可接參數,參數(argument)放在$OPTARG,如果缺參數,optstring是以”:“開頭,varname的值會是:(在我的fedora系統里測試OPTARG?),$OPTARG是該option,?否則varname的值是?,$OPTARG是該option.(參照細則1)(在我的fedora系統里測試OPTARG為空)

1?#!/bin/bash??

2?if?[[?$#?-lt?1?]];then??

3?????echo?"USAGE:`basename?$0`?[-a]?[-b?value]?[-c]"??

4?????exit?1??

5?fi????

6????

7?while?getopts?:ab:c?name??

8?do??

9?????case?$name?in??

10?????????a)??aflag=1??

11?????????echo?"a"??

12?????????;;??

13?????????b)??bflag=1??

14???

15?????????if?[[?${OPTARG:0:1}?=?"-"?]];?then??

16?????????????echo?"invalid?parameter?of?$OPTARG"??

17?????????????exit?1??

18?????????fi??

19???

20?????????bval=$OPTARG??

21?????????;;??

22?????????c)??cflag=1??

23?????????echo?"c"??

24?????????;;??

25?????????\?)?echo?"Invalid?option?:`basename?$0`?[-a]?[-b?value]?[-c]"??

26?????????exit?1??

27?????????;;??

28?????????:)?echo?"$0:Must?supply?an?argument?to?-$OPTARG."??

29?????????exit?1??

30?????????;;??

31?????esac??

32?done??

33?echo?$bval??

getopts分析選項時,如果-b后面不帶參數,直接跟-c的話,那么-c將作為-b的參數。


下面是一個簡單例子(腳本為getopt):


#/bin/bash

echo?$0

echo?$*

while?getopts?":a:bc"?opt

do

????????case?$opt?in

????????????????a?)

????????????????????????echo?$OPTARG????????????????????

????????????????????????echo?$OPTIND;;

????????????????b?)

????????????????????????echo?"b?$OPTIND";;

????????????????c?)

????????????????????????echo?"c?$OPTIND";;

??????????????????)

????????????????????????echo?"error"????????????????????

????????????????????????exit?1;;

????????????????esac

done

echo?$OPTIND

echo?$*

shift?$(($OPTIND?-?1))

echo?$*

echo?$0

運行sh?getopt.sh??-a?12?-b?-c?34?-m
輸出:

getopt.sh

-a?12?-b?-c?34

12

3

b?4

c?5

5

-a?12?-b?-c?34

34

getopt.sh

可以得出一些結論: 

1$0在用sh?或者?./執行腳本時,指的是腳本名,用source.執行時,永運是bash,這也反應了sh?或者?./執行腳本的原理和source的方式是不同的.

2$1?(1....n)指的第一個參數到....n個參數

3OPTARG存儲相應選項的參數?OPTIND指向的是下一個參數的index

4shift?會改變參數的順序,通過左移去掉某些參數

5、getopts檢測到非法參數就會停止,比如上例中遇到34就會終止,并不會去檢測-m了,也就是說只要前一個參數是合法的(包含在option_string中的),就會繼續檢測下一個參數。

另外: unset OPTIND? 可以解決shell腳本的函數中使用getopts

總結

以上是生活随笔為你收集整理的shell 命令行实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。