Shell指令碼學習-命令列引數處理
在Linux的Shell中怎樣處理tail
-n 10 access.log這樣的命令列選項呢?這是被別人問起的一個問題,好好學習了一下,進行總結如下:
在bash中,可以用以下三種方式來處理命令列引數,每種方式都有自己的應用場景。
1.直接處理,依次對
2.getopts來處理,單個字元選項的情況(如:-n 10 -f file.txt等選項);
3.getopt,可以處理單個字元選項,也可以處理長選項long-option(如:–prefix=/home等)。
總結:一般小指令碼手工處理也許就夠了,getopts能處理絕大多數的情況,getopt較複雜、功能也更強大。
1.直接手工處理位置引數
必須要要知道幾個變數,
* $0 :即命令本身,相當於C/C++中的argv[0]
* $1 :第一個引數.
*
* $# 引數的個數,不包括命令本身
* [email protected] :引數本身的列表,也不包括命令本身
*
手工處理方式能滿足多數的簡單需求,配合shift使用也能構造出強大的功能,但處理複雜選項的時候建議用下面的兩種方法。
#!/bin/bash if [ # -lt 1 ]; then echo “error.. need args” exit 1 fi echo “commond is0” echo “args are:” for arg in “ 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.
[[email protected] ~] getopts is a shell builtin |
getopts不能直接處理長的選項(如:–prefix=/home等)
關於getopts的使用方法,可以man bash 搜尋getopts
getopts有兩個引數,第一個引數是一個字串,包括字元和“:”,每一個字元都是一個有效的選項,如果字元後面帶有“:”,表示這個字元有自己的引數。getopts從命令中獲取這些引數,並且刪去了“-”,並將其賦值在第二個引數中,如果帶有自己引數,這個引數賦值在“OPTARG”中。提供getopts的shell內建了OPTARG這個變變,getopts修改了這個變數。
這裡變數
while getopts “:a:bc” opt #第一個冒號表示忽略錯誤;字元後面的冒號表示該選項必須有自己的引數
程式碼例項(getopts.sh):
echo a ) echo b ) echo “b ? ) echo “error” exit 1;; esac done echo |
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’ – “
# Note the quotes around `$TEMP’: they are essential!
#set 會重新排列引數的順序,也就是改變
#經過getopt的處理,下面處理具體選項。
while true ; do
case “
-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 “
相關推薦
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。 $# 傳遞給指令碼或函式的引數個數。 $* 傳遞給指令碼或函式的所有引數