shell指令碼程式設計 處理命令列引數

2022-08-27 05:30:14 字數 4721 閱讀 6692

(1)讀取引數

bash shell使用位置引數的特殊變數記錄命令列引數,$0是程式名,$1~$9依次為輸入引數;

如果指令碼需要多餘9個變數,需要將變數數字加花括號,如$;

命令列輸入的引數需要以空格分隔,當空格作為引數的一部分時可以使用引號分開;

在指令碼中對命令列引數進行處理時需要對引數進行有效性判斷,如:

1     $ cat

test

2 #!/bin/bash

3#test param

4if [ -n "

$1" ]; then

5echo nice to meet $1

6else

7echo

"no paran input"8

fi

(2)讀取程式名

可以使用$0獲取命令列啟動的程式的名字;

當傳給$0變數的字串是整個指令碼路徑時,$0變數則是整個路徑,而不僅僅是程式名;

使用basename命令可以獲取程式名而不包括路徑,如:

name=`basename $0`

(3)引數計數

$#變數儲存了執行指令碼時命令列輸入引數的個數,可以在指令碼的任何地方訪問$#變數的值;

可以通過$#變數訪問命令列的最後乙個引數:$ —— 由於在花括號內不能使用美元符,可以使用嘆號替換;

1     $ cat

test

2 #!/bin/bash

3# test $#

4 params=$#

5echo the last

param is $params

6echo the last param is $

7 $ ./test 123

458 the last param is 5

9 the last param is 5

(4)獲取所有的引數

可以通過 $#變數獲取命令列引數的個數,依次對所有引數進行處理;

$*和$@變數,提供了對所有引數的快速訪問;

$*變數會將所有引數當做單個引數,而$@變數會單獨處理每個引數,如:

1     $ cat

test

2 #!/bin/bash

3 # test $*and $@

4echo

"\$* is $*"5

echo

"\$@ is $@

"6 count=1

7for param in"$*

"; do

8echo

"\$* param #$count=$param

"9 count=$[ $count + 1]10

done

11 count=1

12for param in"$*

"; do

13echo

"\$* param #$count=$param

"14 count=$[ $count + 1]15

done

16 $ ./test a b c

17 $*is a b c

18$@ is a b c

19 $* param #1=a b c

20 $@ param #1=a

21 $@ param #2=b

22 $@ param #3=c

(1)移動變數

shift命令可以用來移動命令列引數。

預設情況下,shift命令會將命令列引數減一。$n的值依次遞減,$1的值會被刪除;

使用shift時,$0的值不改變;

可以使用shift n 命令修改每次移動的位數;

注意,在使用shift命令時,一旦引數被移除後,不可恢復。

(2)使用getopt命令處理選項

選項(options)是只命令列引數中單破折號後面的單個字母;

getopt命令可以用來處理命令列選項和引數,格式:

getopt optstring options params

optstring定義了命令列有效的選項字母,和那些選項需要引數值(在選項後加冒號表示);

例如:

$getopt ab:c -a -b test1 -c test2 test3

-a -b test1 -c -- test2 test3

使用--將選項和非選項自帶的引數分開;

如果定義了不在optstring的選項,getopt命令會產生一條錯誤,-p選項可以忽略錯誤訊息;

在指令碼中使用getopt命令,可以使用set命令,set命令的--選項可以將命令列引數替換成set命令的命令列引數;

$cat test.sh

#!/bin/bash

# extracting command line options and values with

getopt

set -- `getopt -q ab:c "$@"

`

while [ -n "

$1" ]; do

case"$1

"in-a) echo

"find -a option";;

-b) echo

"find -b option,and value is $2

"shift

;; -c) echo

"find -c option";;

--) shift

break ;;

*) echo

"$1 is not a option

"esac

shift

done

count=1

for param in"$@

"; do

echo

"parameter #$count: $param

"count=$[ $count + 1

]

done

$ ./test.sh -a -b 111 -c 222

333find -a option

find -b option,and value is '

111'

find -c option

parameter #

1: '

222'

parameter #

2: '

333'

(3)getopts命令

getopt命令可以將命令列上的所有選項和引數處理後只生成乙個輸出;

getopts命令每次呼叫時只處理乙個命令列上檢測的引數,處理完所有的引數後,它會退出並返回乙個大於0的狀態;

格式:   

getopts optstring variable

optstring和getopt命令基本一致,需要去掉錯誤提示時,只需要在optstring前加乙個冒號;

getopts將當前引數儲存在variable中;

getopts會用到兩個環境變數,如果選項需要跟乙個引數,optarg環境變數儲存這個引數;optind環境變數儲存了引數列表中getopts正在處理的引數位置;

1     $ cat test.sh

2 #!/bin/bash 3

# processing options and parameters with getopts 4

while getopts :ab:cd opt ; do

5case

"$opt"in

6 a) echo

"find the -a option";;

7 b) echo

"find the -b option, with value $optarg";;

8 c) echo

"find the -c option";;

9 d) echo

"find the -d option";;

10 *) echo

"unknown option $opt";;

11esac

12done

13shift $[ $optind - 1

]14 count=1

15for param in"$@

"; do

16echo

"parameter $count : $param

"17 count=$[ $count + 1]18

done

19 $ ./getopt.sh -a -btest1 -c test2 test3

20find -a option

21find -b option,and value is '

test1'22

find -c option

23 parameter #1: '

test2

'24 parameter #2: '

test3

'

getopts在使用時會移除選項前的單線破折號;

getopts允許選項和引數拼接在一起使用,不用加空格;

getopts會把所有未定義的選項統一輸出成問號;

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

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

Linux程式設計 用getopt處理命令列引數

函式宣告如下 include int getopt int argc,char const argv,const char optstrin g extern char optarg extern int optind,opterr,optopt 以下是一些主要的介紹。詳細的介紹參閱 該函式的arg...

《Linux命令列與shell指令碼程式設計大全》

系統記憶體管理 核心通過硬碟上的儲存空間來實現虛擬記憶體,這塊區域稱為交換空間。換出 換入 cat proc meminfo 共享記憶體頁面 ipcs m 檢視系統上的當前共享記憶體頁面 init程序 啟動系統上所有其他程序 開機時要自動啟動的程序 etc inittab 而ubuntu等 etc ...