婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > bash shell命令行選項與修傳入參數處理

bash shell命令行選項與修傳入參數處理

熱門標簽:地圖標注員都是年輕人 打電話機器人接我是他的秘書 江蘇云電銷機器人公司 客服外呼系統怎么樣 華鋒e路航港口地圖標注 揭陽智能電話機器人推薦 河南信譽好的不封卡電話外呼系統 如果做線上地圖標注 百度地圖標注錯了有責任嗎


在編寫shell程序時經常需要處理命令行參數,本文描述在bash下的命令行處理方式。
選項與參數:
如下命令行:
 

復制代碼 代碼如下:

./test.sh -f config.conf -v --prefix=/home

-f為選項,它需要一個參數,即config.conf, -v 也是一個選項,但它不需要參數。
--prefix我們稱之為一個長選項,即選項本身多于一個字符,它也需要一個參數,用等號連接,當然等號不是必須的,/home可以直接寫在--prefix后面,即--prefix/home,更多的限制后面具體會講到。
在bash中,可以用以下三種方式來處理命令行參數,每種方式都有自己的應用場景。
* 手工處理方式
* getopts
* getopt
依次討論這三種處理方式。
1,手工處理方式
在手工處理方式中,首先要知道幾個變量,還是以上面的命令行為例:
復制代碼 代碼如下:

*    $0 : ./test.sh,即命令本身,相當于c/c++中的argv[0]
*    $1 : -f,第一個參數.
*    $2 : config.conf
*    $3, $4 ... :類推。
*    $#  參數的個數,不包括命令本身,上例中$#為4.
*    $@ :參數本身的列表,也不包括命令本身,如上例為 -f config.conf -v --prefix=/home
*    $* :和$@相同,但"$*" 和 "$@"(加引號)并不同,"$*"將所有的參數解釋成一個字符串,而"$@"是一個參數數組。

例子:

復制代碼 代碼如下:

#!/bin/bash
for arg in "$*"
do
   echo $arg
done
for arg in "$@"
do
 echo $arg
done

執行./test.sh -f config.conf -n 10 會打印:
-f config.conf -n 10    #這是"$*"的輸出
-f   #以下為$@的輸出
config.conf
-n
10
所以,手工處理的方式即對這些變量的處理。因為手工處理高度依賴于你在命令行上所傳參數的位置,所以一般都只用來處理較簡單的參數。
(腳本學堂 www.jb51.net 編輯整理)
例如:
./test.sh 10
而很少使用./test -n 10這種帶選項的方式。 典型用法為:

復制代碼 代碼如下:

#!/bin/bash
if [ x$1 != x ]
then
    #...有參數
else
then
    #...沒有參數
fi

為什么要使用 x$1 != x 這種方式來比較呢?想像一下這種方式比較:
if [ -n $1 ]  #$1不為空
但如果用戶不傳參數的時候,$1為空,這時 就會變成 [ -n ] ,所以需要加一個輔助字符串來進行比較。
手工處理方式能滿足大多數的簡單需求,配合shift使用也能構造出強大的功能,但在要處理復雜選項的時候建議用下面的兩種方法。

2. getopts/getopt
處理命令行參數是一個相似而又復雜的事情,為此,c提供了getopt/getopt_long等函數,
c++的boost提供了options庫,在shell中,處理此事的是getopts和getopt.
getopts和getopt功能相似但又不完全相同,其中getopt是獨立的可執行文件,而getopts是由bash內置的。
先來看看參數傳遞的典型用法:
復制代碼 代碼如下:

    * ./test.sh -a -b -c  : 短選項,各選項不需參數
    * ./test.sh -abc   : 短選項,和上一種方法的效果一樣,只是將所有的選項寫在一起。
    * ./test.sh -a args -b -c :短選項,其中-a需要參數,而-b -c不需參數。
    * ./test.sh --a-long=args --b-long :長選項

先來看getopts,它不支持長選項。
使用getopts非常簡單:

復制代碼 代碼如下:

#test.sh
#!/bin/bash
while getopts "a:bc" arg #選項后面的冒號表示該選項需要參數
do
        case $arg in
             a)
                echo "a's arg:$optarg" #參數存在$optarg中

             b)
                echo "b"

             c)
                echo "c"

             ?)  #當有不認識的選項的時候arg為?
            echo "unkonw argument"
        exit 1

        esac
done

現在就可以使用:
./test.sh -a arg -b -c

./test.sh -a arg -bc
來加載了。
應該說絕大多數腳本使用該函數就可以了,如果需要支持長選項以及可選參數,那么就需要使用getopt.
getopt自帶的一個例子:
復制代碼 代碼如下:

#!/bin/bash
# a small example program for using the new getopt(1) program.
# this program will only work with bash(1)
# an similar program using the tcsh(1) script language can be found
# as parse.tcsh
# example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "
# option a
# option c, no argument
# option c, argument `more'
# option b, argument ` very long '
# remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*\?'
# note that we use `"$@"' to let each command-line parameter expand to a
# separate word. the quotes around `$@' are essential!
# we need temp as the `eval set --' would nuke the return value of getopt.
#-o表示短選項,兩個冒號表示該選項有一個可選參數,可選參數必須緊貼選項
#如-carg 而不能是-c arg
#--long表示長選項
#"$@"在上面解釋過
# -n:出錯時的信息
# -- :舉一個例子比較好理解:
#我們要創建一個名字為 "-f"的目錄你會怎么辦?
# mkdir -f #不成功,因為-f會被mkdir當作選項來解析,這時就可以使用
# mkdir -- -f 這樣-f就不會被作為選項。
temp=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
     -n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "terminating..." >2 ; exit 1 ; fi
# note the quotes around `$temp': they are essential!
#set 會重新排列參數的順序,也就是改變$1,$2...$n的值,這些值在getopt中重新排列過了
eval set -- "$temp"
#經過getopt的處理,下面處理具體選項。
while true ; do
        case "$1" in
                -a|--a-long) echo "option a" ; shift ;;
                -b|--b-long) echo "option b, argument \`$2'" ; shift 2 ;;
                -c|--c-long)
                        # c has an optional argument. as we are in quoted mode,
                        # an empty parameter will be generated if its optional
                        # argument is not found.
                        case "$2" in
                                "") echo "option c, no argument"; shift 2 ;;
                                *)  echo "option c, argument \`$2'" ; shift 2 ;;
                        esac ;;
                --) shift ; break ;;
                *) echo "internal error!" ; exit 1 ;;
        esac
done
echo "remaining arguments:"
for arg do
   echo '--> '"\`$arg'" ;
done

比如使用
./test -a  -b arg arg1 -c
你可以看到,命令行中多了個arg1參數,在經過getopt和set之后,命令行會變為:
-a -b arg -c -- arg1
$1指向-a,$2指向-b,$3指向arg,$4指向-c,$5指向--,而多出的arg1則被放到了最后。
3,總結
一般小腳本手工處理也就夠了,getopts能處理絕大多數的情況,getopt較復雜,功能也更強大。

您可能感興趣的文章:
  • bash批量修改文件名稱的方法小結(增加,去除,修改后綴)
  • bash 編程中循環語句用法
  • BASH 學習筆記小結
  • Bash Shell字符串操作小結
  • Shell 編程:Bash空格的那點事
  • linux bash字符串處理大全
  • Bash中尖括號的更多使用方法

標簽:許昌 馬鞍山 赤峰 邵陽 金昌 淘寶邀評 婁底 巴彥淖爾

巨人網絡通訊聲明:本文標題《bash shell命令行選項與修傳入參數處理》,本文關鍵詞  bash,shell,命令行,選項,與,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《bash shell命令行選項與修傳入參數處理》相關的同類信息!
  • 本頁收集關于bash shell命令行選項與修傳入參數處理的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    免费成人在线网站| 午夜精品福利在线| 狠狠色丁香久久婷婷综合_中 | 成人av在线电影| 亚洲四区在线观看| 精品福利一二区| 欧美国产日韩亚洲一区| 欧美激情在线看| 亚洲精品欧美专区| 欧美少妇xxx| 激情综合色丁香一区二区| 亚洲手机成人高清视频| 国产精品丝袜久久久久久app| 欧美高清视频不卡网| 日韩国产欧美在线视频| 国产精品福利一区| 久草精品在线观看| 韩国女主播一区二区三区| 欧美高清在线一区二区| 久久久久国产精品人| 欧美一级生活片| 欧美一区二区三区免费| 日韩视频免费观看高清完整版在线观看 | 国产精品毛片大码女人| 91麻豆自制传媒国产之光| 91成人免费在线| 欧美高清在线视频| 波多野结衣视频一区| 国产亚洲综合色| 国产91精品精华液一区二区三区| 国产精品久久免费看| 欧美aaa在线| 亚洲美女淫视频| 亚洲国产美国国产综合一区二区| 欧美久久一二区| 欧美一区二区三区思思人| www.亚洲人| 国产精品国产a| 亚洲精品欧美综合四区| 日韩不卡一区二区三区| 亚洲欧美国产三级| 精品影院一区二区久久久| 91亚洲国产成人精品一区二区三| 不卡一二三区首页| 亚洲欧美激情插| 国产精品亚洲综合一区在线观看| 九色综合国产一区二区三区| 67194成人在线观看| 香蕉成人伊视频在线观看| 99久久综合色| 亚洲最大成人综合| 欧美一区在线视频| 久久品道一品道久久精品| 99热国产精品| 色网综合在线观看| 天天射综合影视| 色综合av在线| 欧美电视剧免费观看| 欧美变态tickle挠乳网站| 国产99一区视频免费| 亚洲国产sm捆绑调教视频| 亚洲日本成人在线观看| 狠狠色狠狠色合久久伊人| 日韩精品在线网站| 久久国产麻豆精品| 欧美猛男gaygay网站| 夜夜操天天操亚洲| 国产一区久久久| 7777精品伊人久久久大香线蕉经典版下载 | 中文字幕av免费专区久久| 99国产精品久久久久| 亚洲一区二区在线视频| 国产亚洲精品aa| 韩国女主播成人在线观看| 欧美精品一区二区三区在线播放| 国产一区二区在线影院| 国产日韩欧美精品在线| 亚洲精品成人悠悠色影视| 欧美成人综合网站| 欧美熟乱第一页| 91丨porny丨蝌蚪视频| 日韩不卡免费视频| 国产精品久久久久久久久久免费看| 色综合中文字幕| 天使萌一区二区三区免费观看| 欧美日韩视频在线第一区| 性做久久久久久| 视频一区视频二区中文字幕| 国内外精品视频| 亚洲一区二区四区蜜桃| 亚洲乱码国产乱码精品精98午夜| 美女一区二区视频| 国产日韩精品视频一区| 欧美一区二区三区色| 午夜av一区二区三区| 中文一区二区在线观看| 日韩欧美第一区| 97se狠狠狠综合亚洲狠狠| 国产精一区二区三区| 麻豆传媒一区二区三区| 国产亚洲成av人在线观看导航| 欧美一区二区三区色| 555www色欧美视频| 欧美精品久久久久久久多人混战| 欧美日韩一区精品| 成人激情开心网| av资源站一区| 在线观看视频一区| 欧美日韩一区二区电影| aaa国产一区| 91蜜桃婷婷狠狠久久综合9色| av在线不卡电影| 成人精品一区二区三区四区| 国产一区二区女| 精品一区二区国语对白| 午夜激情一区二区| 日韩黄色小视频| 玖玖九九国产精品| 91原创在线视频| 91麻豆精品国产自产在线观看一区 | 337p亚洲精品色噜噜| 欧美一卡二卡在线观看| 国产精品麻豆一区二区| 亚洲曰韩产成在线| 精品一区二区在线观看| 成人精品gif动图一区| 欧美系列亚洲系列| 精品嫩草影院久久| 中文字幕亚洲电影| 美腿丝袜在线亚洲一区| 青青青伊人色综合久久| 国产激情一区二区三区| 国产一区999| 日韩欧美一级在线播放| 国产欧美精品一区二区色综合朱莉| 中文字幕免费一区| 日本va欧美va精品发布| 91麻豆精品视频| 久久老女人爱爱| 免费精品视频在线| 色婷婷激情综合| 欧美精品一区二区在线播放| 国产三级欧美三级| 三级不卡在线观看| 一本大道综合伊人精品热热| 精品精品国产高清a毛片牛牛| 全部av―极品视觉盛宴亚洲| 在线观看日韩高清av| 欧美激情艳妇裸体舞| 奇米一区二区三区av| 色婷婷激情久久| 国产人久久人人人人爽| 免费成人av在线播放| 欧美日韩在线亚洲一区蜜芽| 中文字幕一区三区| 国产一区二区三区精品视频| 欧美日韩第一区日日骚| 亚洲视频小说图片| 国产999精品久久久久久绿帽| 日韩欧美一级精品久久| 亚洲mv在线观看| 在线免费av一区| 亚洲国产综合人成综合网站| 色爱区综合激月婷婷| 亚洲在线视频免费观看| 日韩限制级电影在线观看| 国产高清精品在线| 亚洲图片激情小说| 日本高清不卡一区| 日韩国产一二三区| 337p日本欧洲亚洲大胆色噜噜| 成人黄动漫网站免费app| 亚洲精品菠萝久久久久久久| 91精品国产色综合久久ai换脸| 国产99久久久国产精品潘金| 亚洲综合色婷婷| 久久香蕉国产线看观看99| 成人深夜视频在线观看| 亚洲国产精品天堂| 久久久久久久久久久久久久久99 | 亚洲综合视频在线观看| 精品国产乱码久久| 91亚洲国产成人精品一区二区三| 亚洲h动漫在线| 精品日韩av一区二区| 久久99国内精品| 成人免费毛片aaaaa**| 亚洲永久免费视频| 26uuu国产一区二区三区| 色88888久久久久久影院野外| 精品一区二区三区在线播放视频 | 91激情五月电影| 国产精品综合一区二区三区| 五月天精品一区二区三区| 欧美国产欧美综合| 日韩一级免费观看| 欧美三区在线视频| 91性感美女视频| 国产成人av电影在线| 精品一区二区三区在线播放|