1. 程式人生 > >Shell指令碼學習-命令列引數處理

Shell指令碼學習-命令列引數處理

LinuxShell中怎樣處理tail -n 10 access.log這樣的命令列選項呢?這是被別人問起的一個問題,好好學習了一下,進行總結如下:

在bash中,可以用以下三種方式來處理命令列引數,每種方式都有自己的應用場景。
1.直接處理,依次對1,2,…,$n進行解析,分別手工處理;
2.getopts來處理,單個字元選項的情況(如:-n 10 -f file.txt等選項);
3.getopt,可以處理單個字元選項,也可以處理長選項long-option(如:–prefix=/home等)。
總結:一般小指令碼手工處理也許就夠了,getopts能處理絕大多數的情況,getopt較複雜、功能也更強大。

下面分別進行簡單的說明:

1.直接手工處理位置引數

必須要要知道幾個變數,
    *    $0 :即命令本身,相當於C/C++中的argv[0]
    *    $1 :第一個引數.
    *    2,3, $4 … :第2、3、4個引數,依次類推。
    *    $#  引數的個數,不包括命令本身
    *    [email protected] :引數本身的列表,也不包括命令本身
    *    @相同,但”""@”(加引號)並不同,”""@”是一個引數陣列。
手工處理方式能滿足多數的簡單需求,配合shift使用也能構造出強大的功能,但處理複雜選項的時候建議用下面的兩種方法。

給個例項吧(getargs.sh):

#!/bin/bash
if [ # -lt 1 ]; then 
    echo “error.. need args” 
    exit 1 
fi 
echo “commond is
0”
echo “args are:”
for arg in “@doechoarg
done

執行命令:./getargs.sh 11 22 cc
commond is ./getargs.sh
args are:
11
22
cc

2.getopts (Shell內建命令)

處理命令列引數是一個相似而又複雜的事情,為此,C提供了getopt/getopt_long等函式,C++的boost提供了Options庫,在shell中,處理此事的是getopts和getopt.

先說一下getopts/getopt的區別吧,getopt是個外部binary檔案,而getopts是shell builtin。

[[email protected] ~]typegetoptgetoptis/usr/bin/getopt[admin@intlqa142055x] type getopts
getopts is a shell builtin

getopts不能直接處理長的選項(如:–prefix=/home等)
關於getopts的使用方法,可以man bash  搜尋getopts
getopts有兩個引數,第一個引數是一個字串,包括字元和“:”,每一個字元都是一個有效的選項,如果字元後面帶有“:”,表示這個字元有自己的引數。getopts從命令中獲取這些引數,並且刪去了“-”,並將其賦值在第二個引數中,如果帶有自己引數,這個引數賦值在“OPTARG”中。提供getopts的shell內建了OPTARG這個變變,getopts修改了這個變數。
這裡變數OPTARGOPTIND總是儲存原始$*中下一個要處理的元素位置。
while getopts “:a:bc” opt  #第一個冒號表示忽略錯誤;字元後面的冒號表示該選項必須有自己的引數
程式碼例項(getopts.sh):




echo whilegetopts:a:bcoptdocaseopt in

                a ) echo OPTARGechoOPTIND;;

                b ) echo “b OPTIND;;c)echocOPTIND”;;

                ? ) echo “error”

                    exit 1;;

        esac

done

echo OPTINDshift(($OPTIND - 1))
#通過shift ((OPTIND - 1))的處理,shellecho0
echo $*
執行命令:./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh

3.getopt(一個外部工具)

具體用用法可以 man getopt
#-o表示短選項,兩個冒號表示該選項有一個可選引數,可選引數必須緊貼選項,如-carg 而不能是-c arg
#–long表示長選項
簡單舉個例子吧(getopt.sh): #!/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 `”[email protected]”’ to let each command-line parameter expand to a
# separate word. The quotes around `[email protected]’ are essential!
# We need TEMP as the `eval set –’ would nuke the return value of getopt.

#-o表示短選項,兩個冒號表示該選項有一個可選引數,可選引數必須緊貼選項
#如-carg 而不能是-c arg
#–long表示長選項
#”[email protected]”在上面解釋過
# -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…ngetoptevalsetTEMP”

#經過getopt的處理,下面處理具體選項。

while true ; do
        case “1ina|along)echoOptiona;shift;;b|blong)echoOptionb,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 “2i

相關推薦

Shell指令碼學習-命令引數處理

在Linux的Shell中怎樣處理tail -n 10 access.log這樣的命令列選項呢?這是被別人問起的一個問題,好好學習了一下,進行總結如下: 在bash中,可以用以下三種方式來處理命令列引數,每種方式都有自己的應用場景。 1.直接處理,依次

Python 處理指令碼命令引數

# -*- coding:utf-8 -*- import sys def test(): """ 引數列表:sys.argv 引數個數:len(sys.argv) 指令碼名: sys.argv[0] 引數1: sys.argv[1] 引數2:

Linux 程式設計學習筆記----命令引數處理

問題引入----命令列引數及解析 在使用linux時,與windows最大的不同應該就是經常使用命令列來解決大多數問題.比如下面這樣的: 而顯然我們知道C語言程式的入口是mian函式,即是從main函式開始執行,而main函式的原型是: int main( int a

boost之program_option-命令引數處理(霜之小刀)

歡迎轉載和引用,若有問題請聯絡 若有疑問,請聯絡 Email : [email protected] QQ:2279557541 命令列的引數處理什麼xxx –xxx -x=xx -x 這種東西如果我們自己從argc,argv裡面提取,我相信大家

使用shell指令碼命令 新增crontab 定時任務

crontab 是運維過程中常用的定時任務執行工具         一般情況下在有新的定時任務要執行時,使用crontab -e ,將開啟一個vi編輯介面,配置好後儲存退出,但是在自動化運維的過程中往往需要使用shell指令碼或命令自動新增定時任務。接下來結束三種(Cent

python命令引數處理:argparse、optparse和getopt

一 命令列引數: (1)在python中: *sys.argv:命令列引數的列表。 *len(sys.argv):命令列引數的個數(argc)。 *python中提供了三個模組來輔助處理命令列引數:getopt,optparse和argparse。 (2)術語: *arg

shell 如何判斷命令引數個數

$#代表了命令列的引數數量,可以看以下例項:if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; fi 位置引數 $1, $2,..., $

Shell指令碼學習指南(四)——文字處理工具

grep 字串查詢,預設用BRE grep [options] ‘string’ filename -E 使用ERE -a 以文字檔案方式搜尋 -c 計算找到的符合行的次數 -i 忽略大小寫 -n 順便輸出行號 -v 反向選擇,即顯示不包含匹配文字的所有行

Linux下C程式命令引數處理

       Linux下開發C程式,甚至是GUI程式,都可能需要處理複雜的命令列引數。健全、可靠的複雜命令列引數處理機制,可使程式方便使用,也更顯專業。Linux下幾乎所有的命令都提供了引數處理機制,包括短選項和長選項。  POSIX標準中對程式名、引數作了如下相關約定: 

Linux系統命令Shell指令碼學習筆記五:字元處理

管道 管道可以把一個命令的輸出內容當作下一個命令的輸入內容,兩個命令之間只需要使用管道符號連線即可,由管道連線起來的程序可以自動執行。 ls -l /etc/init.d | more 檢視目錄下檔案的詳細資訊,但會因為輸出內容過多而造成翻屏,先輸出的內容就會看不到了,利用

impala-shell命令引數

轉發 https://my.oschina.net/weiqingbin/blog/190929 你可以在啟動 impala-shell 時設定以下選項,用於修改命令執行環境。   Note: 這些選項與 impalad 守護程序的配置選

google gflags 處理命令引數

#include <string> #include <iostream> #include <gflags/gflags.h> using namespace std; DEFINE_string(input_path, "empty" , "input f

nodejs漸入佳境[7]-yargs處理命令引數

yargs用於方便的處理命令列引數。匯入yargs包,在專案路徑下: 1 > npm install --save yargs 原始檔案 app.js: 12345678 const yargs = requi

DOS(CMD)下批處理換行問題/命令引數換行 arg ms-dos

程式來自:http://hi.baidu.com/nxhujiee/item/ae52584c36a13d0f6dc2f0f8 DOS(CMD)下批處理換行問題本人經常寫一些DOS批處理檔案,由於批處理中命令的參考較多且長,寫在一行太不容易分辨,所以總想找個辦法把一條命令

Go語言學習筆記(十七)之命令引數

24.1命令列引數 os.Args命令列引數的切片 1: func main() { 2: name := "Alice" 3: fmt.Println("Good Morning", name) 4: // 說明使用者傳入了引數 5: if len(os.Args) >

python中處理命令引數的模組optpars

optpars是python中用來處理命令列引數的模組,可以自動生成程式的幫助資訊,功能強大,易於使用,可以方便的生成標準的,符合Unix/Posix 規範的命令列說明。使用 add_option() 來加入選項,使用 parse_args() 來解析命令列。add_opti

springboot學習總結(一)外部配置(命令引數配置、常規屬性配置、型別安全的配置之基於properties)

學習的內容主要是汪雲飛的《Spring Boot實戰》 (一)命令列引數配置 springboot專案可以基於jar包執行,開啟jar的程式可以通過下面命令列執行: java -jar xxx.jar 可以通過以下命令修改tomcat埠號 java -jar xxx.jar --server.por

ffmpeg 原始碼學習 -- 之命令引數解析

ffmpeg 原始碼學習 -- 之ffmpeg命令列引數解析 大家通過git在安裝好cygwin之後,下載原始碼到(cygwin)home目錄,通過./configure  ...... ,可以新增一堆引數選項,執行可以生成config.mk等編譯使用的檔案,通過命令對工

tensorflow 學習(三)使用flags定義命令引數

tf定義了tf.app.flags,用於支援接受命令列傳遞引數,相當於接受argv。 import tensorflow as tf #第一個是引數名稱,第二個引數是預設值,第三個是引數描述 t

shell特殊變數$0,$#,[email protected],$*,$?,$$和命令引數

變數   含義 $0     當前指令碼的檔名     $n     傳遞給指令碼或函式的引數。n 是一個數字,表示第幾個引數。例如,第一個引數是$1,第二個引數是$2。    $#     傳遞給指令碼或函式的引數個數。     $*     傳遞給指令碼或函式的所有引數