发布时间:2014-09-05 13:34:33作者:知识屋
前面已经讲到如何使用特定变量$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 显示方式或版本
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能