(1)讀取引數
bash shell使用位置引數的特殊變數記錄命令列引數,$0是程式名,$1~$9依次為輸入引數;
如果指令碼需要多餘9個變數,需要將變數數字加花括號,如$;
命令列輸入的引數需要以空格分隔,當空格作為引數的一部分時可以使用引號分開;
在指令碼中對命令列引數進行處理時需要對引數進行有效性判斷,如:
1 $ cattest
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 $ cattest
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 $ cattest
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.sh2 #!/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 ...