歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

linuxshell編程指南----向腳本傳遞參數

前面已經講到如何使用特定變量$1,$9向腳本傳遞參數。$#用於統計傳遞參數的個數。可以創建一個usage語句,需要時可通知用戶怎樣以適當的調用參數調用腳本或函數。

簡單地說,下述腳本框架控制參數開始與停止。腳本需要兩個參數,如果沒有輸入兩個參數,那麼產生一個usage語句。注意這裡使用case語句處理輸入腳本的不同參數。
[root@localhost huangcd]# cat opt
#!/bin/bash
usage()
{
echo "usage:`basename $0` start|stop process name"
}
OPT=$1
PROCESSID=$2
if [ $# -ne 2 ]
then
usage
exit1
fi
case $OPT in
start|Start)
echo "Starting..$PROCESSID"
;;
stop|Stop)
echo "Stoping..$PROCESSID"
;;
*) usage
;;
esac
[root@localhost huangcd]# opt start named
Starting..named

任何UNIX或LINUX命令均接受一般格式:

命令選項文件

選項部分最多可包含1 2個不同的值。上述腳本中,如果必須控制不同的命令選項,就要加入大量腳本。這裡只控制兩個選項:開始和停止。

幸運的是shell提供shift命令以幫助偏移選項,使用shift可以去除只使用$1到$9傳遞參數的限制。

向腳本傳遞參數時,有時需要將每一個參數偏移以處理選項,這就是shift命令的功能。它每次將參數位置向左偏移一位,下面用一段簡單腳本詳述其功能。腳本使用while循環反饋所有傳遞到腳本的參數。
[root@localhost huangcd]# opt2 huang cheng du
huang
0
cheng
0
du
0
[root@localhost huangcd]# cat opt2
#!/bin/bash
loop=0
while [ $# -ne 0 ]
do
echo $1
echo $loop
shift
done

雖然還沒有講eval命令,如果需要知道命令行中輸入的最後一個參數(通常是一個文件名),可以有兩種選擇:使用命令eval echo \$$#;使用shift命令:shift 'expr $# -2'。
[root@localhost huangcd]# opt2 huang cheng du
huang
du
cheng
du
du
du
[root@localhost huangcd]# cat opt2
#!/bin/bash
loop=0
while [ $# -ne 0 ]
do
echo $1
eval echo \$$#
shift
done

getopts可以編寫腳本,使控制多個命令行參數更加容易。getopts用於形成命令行處理標准形式。原則上講,腳本應具有確認帶有多個選項的命令文件標准格式的能力。

通過例子可以更好地理解getopts。以下getopts腳本接受下列選項或參數。

a 設置變量ALL為true。

h 設置變量HELP為true。

f 設置變量FILE為true。

v 設置變量VERBOSE為true。

對於所有變量設置,一般總假定其初始狀態為false:

getopts一般格式為:

getopts option_string variable

在上述例子中使用腳本:

while getopts ahfgv OPTION

可以看出while循環用於讀取命令行,optionstring為指定的5個選項(a,h,f,g,v),腳本中variable為OPTION。注意這裡並沒有用連字符指定每一單個選項。

getopts讀取optionstring,獲知腳本中使用了有效選項。

getopts查看所有以連字符開頭的參數,將其視為選項,如果輸入選項,將把這與optionstring對比,如果匹配發現,變量設置為OPTION,如果未發現匹配字符,變量能夠設置為?重復此處理過程直到選項輸入完畢。

getopts接收完所有參數後,返回非零狀態,意即參數傳遞成功,變量OPTION保存最後處理參數,一會兒就可以看出處理過程中這樣做的好處。
[root@localhost huangcd]# getopt1 -a -h -p
ALL is true
HLEP is true
/home/huangcd/getopt1: illegal option -p
[root@localhost huangcd]# getopt1 -a -g
ALL is true
[root@localhost huangcd]# cat getopt1
#!/bin/bash
ALL=false
HELP=false
FILE=false
VERBOSE=false
while getopts ahfgv OPTION
do
case $OPTION in
a) ALL=true
echo "ALL is $ALL"
;;
h) HELP=true
echo "HLEP is $HELP"
;;
f) FILE=true
echo "FILE is $FILE"
;;
v) VERBOSE=true
echo "VERBOSE is $VERBOSE"
;;
esac
done

有時有必要在腳本中指定命令行選項取值。getopts為此提供了一種方式,即在optionstring中將一個冒號放在選項後。例如:
getopts ahfvc: OPTION

上面一行腳本指出,選項a、h、f、v可以不加實際值進行傳遞,而選項c必須取值。使用選項取值時,必須使用變量OPTRG保存該值。如果試圖不取值傳遞此選項,會返回一個錯誤信息。錯誤信息提示並不明確,因此可以用自己的反饋信息屏蔽它,方法如下:

將冒號放在optionstring開始部分。
while getopts :ahfgvc: OPTION

在case語句裡使用?創建一可用語句捕獲錯誤。
[root@localhost huangcd]# cat getopt1
#!/bin/bash
ALL=false
HELP=false
FILE=false
VERBOSE=false
while getopts ahfgv OPTION
do
case $OPTION in
a) ALL=true
echo "ALL is $ALL"
;;
h) HELP=true
echo "HLEP is $HELP"
;;
f) FILE=true
echo "FILE is $FILE"
;;
v) VERBOSE=true
echo "VERBOSE is $VERBOSE"
;;
esac
done
[root@localhost huangcd]# vim getopt1
[root@localhost huangcd]# cat getopt1
#!/bin/bash
ALL=false
HELP=false
FILE=false
VERBOSE=false
COPIES=0
while getopts :ahfgvc: OPTION
do
case $OPTION in
a) ALL=true
echo "ALL is $ALL"
;;
h) HELP=true
echo "HLEP is $HELP"
;;
f) FILE=true
echo "FILE is $FILE"
;;
v) VERBOSE=true
echo "VERBOSE is $VERBOSE"
;;
c) COPIES=$OPTARG
echo "COPIES is $COPIES"
;;
\?)
echo "`basename $0` -[ahfv] -[c value] file" > &2
;;
esac
done

運行上述腳本,選項c不賦值,將返回錯誤,但顯示的是腳本語句中的反饋信息:
[root@localhost huangcd]# getopt1 -ah -c 3
ALL is true
HLEP is true
COPIES is 3
[root@localhost huangcd]# getopt1 -ah -c
ALL is true
HLEP is true
[root@localhost huangcd]# getopt1 -aho
ALL is true
HLEP is true
getopt1 -[a h f v] -[c value] file

在腳本中指定命令行選項時,最好使其命名規則與UNIX或LINUX一致。下面是一些選項及其含義的列表。

選項含義
a 擴展
c 計數、拷貝
d 目錄、設備
e 執行
f 文件名、強制
h 幫助
i 忽略狀態
l 注冊文件
o 完整輸出
q 退出
p 路徑
-v 顯示方式或版本

Copyright © Linux教程網 All Rights Reserved