Shell脚本中参数传递⽅法常⽤有8种
Shell脚本中参数传递⽅法常⽤有8种
1. $# 传递到脚本的参数个数
2. $* 以⼀个单字符串显⽰所有向脚本传递的参数变量。与位置变量不同,此选项参数可超过9个
3. $$ 脚本运⾏的当前进程ID号
4. $! 后台运⾏的最后⼀个进程的进程ID号
5. $@ 与$#相同,但是使⽤时加引号,并在引号中返回每个参数
6. $- 显⽰shell使⽤的当前选项,与set命令功能相同
7. $? 显⽰最后命令的退出状态。0表⽰没有错误,其他任何值表明有错误
8. $()⾥⾯放命令,可以在脚本中执⾏该命令,并返回命令执⾏的输出
下⾯给各位深⼊分析
1、命令⾏参数
向shell脚本传递数据的最基本⽅式是使⽤命令⾏参数。
(1)读取参数
读取输⼊的参数的变量为位置参数,位置参数通过标准数字表⽰,
其中$0为程序名称,$1为第⼀个参数,$2为第⼆个参数,依次类推,直到$9为第九个参数。
shell脚本⾃动将命令⾏参数赋值给各个位置变量。
同时输⼊多个参数(可以是数值也可以是字符串)时,必须使⽤空格分隔(要想在参数值中包含空格,就必须使⽤单引号或双引号)当参数多于9个后,必须在shell脚本内使⽤⼤括号将变量括起来,如${10}。从⽽可以使⽤任意个参数。
(2)读取程序名称
传递给变量$0的字符串实际上是程序的路径(根据调⽤⽅法决定是相对还是绝对路径)。
使⽤basename命令可以去掉路径前缀,只获得程序名称(名字中不可以有空格)。
(3)测试脚本
当脚本认为应该包含参数,却实际上没有数据时,就会出错。
好的⽅法是对参数进⾏检查来保证使⽤参数前确实存在数据,可以使⽤-n参数来检查。
ex: if [ –n “$1” ] then .. else .. fi
2、特殊的参数变量
⽤于跟踪命令⾏参数
(1)参数计数
使⽤特殊变量$#测试执⾏脚本时包含的命令⾏参数个数。脚本中任何位置都可以使⽤$#
ex: if [ $# –ne 2 ] 即可测试参数个数
可以使⽤${!#}来返回最后⼀个命令⾏参数(当⽆参数时,$#为0,⽽${!#}为程序名)
(2)获取所有数据
变量$*将命令⾏中提供的所有参数作为⼀个单词处理,它将多个参数看成⼀个参数。
变量$@将命令⾏中提供的所有参数作为同⼀个字符串中的多个单词处理。允许对其中的值进⾏迭代(⼀般使⽤for),分隔开不同参数
3、移位
shift命令能够改变命令⾏参数的相对位置。默认将每个参数变量左移⼀个位置(变量$0不变,把$1丢弃,注意不可以恢复了!)
在不清楚参数数⽬情况下,这是⼀个迭代参数的好办法。
可以为shift提供⼀个参数,来实现多位移变化。
4、处理选项
选项是由破折号引导的单个字母,⽤于更改命令的⾏为。
(1)出选项
1)处理简单选项
可以使⽤处理命令⾏参数相同的⽅法处理选项,抽取时使⽤case 语句进⾏判断是否符合选项格式。
2)从参数中分离选项
同时使⽤选项和参数时,可以使⽤--指⽰选项列表的结束。发现--后,shell就知道后⾯的是普通参数了,停⽌使⽤case处理选项。
3)处理带值的选项
选项后紧跟参数值,⼀种⽅法是在case中对应选项后使⽤shift和读后⼀位参数的⽅法处理。更好的⽅法如下:
(2)使⽤getopt命令
getopt命令在处理选项和参数时⾮常⽅便。它对参数进⾏重新组织,以便于解析
1)命令格式
getopt可以接受任意形式的选项和参数列表,并⾃动将它们转换为适当的格式。
命令格式为: getopt options optstring parameters
选项字符串(otring)⽤于定义命令⾏中的有效选项字母,以及哪些选项字母需要参数值。
2)脚本中使⽤getopt
需要使⽤set命令将现有的命令⾏选项和参数替换为getopt命令⽣成的格式化形式。
需要将原始脚本命令⾏参数送给getopt命令,然后将 getopt命令输出送给set命令,如下:set – `getopts –q ab:cd “$@”`
但是getopt命令不能很好的处理带有空格的参数值,它将空格解析为参数分隔符,⽽不是将双引号引起来的两个值合并成⼀个参数。解决办法如下:
(3)更⾼级的getopts命令
getopts命令顺序的对现有的shell参数变量进⾏处理,每调⽤⼀次,只处理命令中检测到的参数中的⼀个。处理完所有参数后,以⼤于0的退出状态退出。
⾮常适宜于在循环中解析所有命令⾏参数
格式为: getopts optstring variable
$OPTARG包含需要参数值的选项要使⽤的值,$OPTIND包含getopts停⽌处理时在参数列表中的位置。
注意:当getopts处理时,会将选项前的-去掉,所以对应的case中不需要破折号。
好的特性:
1)可以在参数值中包含空格
2)选项字母和参数值中间可以没有空格
3)将在命令⾏中到的未定义的选项都绑定为单⼀的输出——问号
5、标准化选项
有⼀些字母选项具有标准含义。最好按照标准含义定义选项意义
-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y
6、获取⽤户输⼊
shell脚本返回执行结果当需要在执⾏过程中获得执⾏脚本⼈员的输⼊,使⽤read命令
(1)基本读取
read命令接受标准输⼊或其他⽂件描述符输⼊。读⼊后将数据放⼊⼀个标准变量中。-p 允许在read命令⾏中直接指定⼀个提⽰。
可以指定多个变量,也可以不指定(将放置在REPLY环境变量中)
(2)计时
使⽤-t指定⼀个计时器,计时数满还未输⼊,read返回⼀个⾮0的退出状态。
使⽤-n指定输⼊的字符个数,输⼊达到预定数⽬时,就⾃动结束输⼊
(3)默读
使⽤ -s使输⼊不显⽰在终端(例如输⼊密码)
(4)读取⽂件
最常⽤的⽅法是使⽤cat命令,并通过管道传给包含read的while语句。
ex: cat test | while read line
为了让各位更多深⼊了解给⼀些例⼦
#!/bin/bash
#extracting command text_text_text_line options as parameters
help_info(){
echo "NAME"
echo "\t$0"
echo "SYNOPSIS"
echo "\t$0 is a shell test about process options"
echo "DESCRIPTION"
echo "\toption like -a -b param1 -c param2 -d"
}
if [ $# -lt 0 ]
then
help_info
fi
nomal_opts_act()
{
echo -e "\n### nomal_opts_act ###\n"
while [ -n "$1" ]
do
case "$1" in
-a)
echo "Found the -a option"
;;
-b)
echo "Found the -b option"
echo "The parameter follow -b is $2"
shift
;;
-c)
echo "Found the -c option"
echo "The parameter follow -c is $2"
shift
;
;
-d)
echo "Found the -d option"
;;
*)
echo "$1 is not an option"
;;
esac
shift
done
}
#⽤shell命令⾃建的选项解析,可以按照⾃⼰的想法实现#优点:⾃⼰定制,没有做不到,只有想不到
#缺点:⿇烦
getopt_act()
{
echo -e "\n### getopt_act ###\n"
GETOPTOUT=`getopt ab:c:d "$@"`
set -- $GETOPTOUT
while [ -n "$1" ]
do
case $1 in
-a)
echo "Found the -a option"
;;
-b)
echo "Found the -b option"
echo "The parameter follow -b is "$2""
shift
;;
-c)
echo "Found the -c option"
echo "The parameter follow -c is "$2""
shift
;
;
-d)
echo "Found the -d option"
;;
--)
shift
break
;;
*)
echo "Unknow option: "$1""
;;
esac
shift
done
param_index=1
for param in "$@"
do
echo "Parameter $param_index:$param"
param_index=$[ $param_index + 1 ]
done
}
#⽤getopt命令解析选项和参数
#优点:相对与getopts来说是个半⾃动解析,⾃动组织选项和参数,⽤ -- 符号将选项与参数隔开#缺点:相对于getopts的缺点
#1.需要与set -- 命令配合,不是必须,需要⼿动shift
#2.选项参数中不⽀持空格如 -a -b dog -c "earth moon" -d -f param1 param2 就会解析错误

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。