如何把参数传给shell里的shell 给函数传递参数

linux中shell中参数的传递详解
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),分隔开不同参数
shift命 令能够改变命令行参数的相对位置。默认将每个参数变量左移一个位置(变量$0不变,把$1丢弃,注意 不可以恢复了!)
在不清楚参数数目情况下,这是一个迭代参数的好办法。
可 以为shift提供一个参数,来实现多位移变化。
4、处理选项
选项是由破折号 引导的单个字母,用于更改命令的行为。
(1)找出选项
1)处理简单选项
可以使用处理命令行参数相同的方法处理选项,抽取时使用case 语句进行判断是否符合选项格式。
2)从参数中分离选项
同 时使用选项和参数时,可以使用--指示选项的结束。发现--后,shell就知道后面的是普通参数了,停止使用case处理选项。
3) 处理带值的选项
选项后紧跟参数值,一种方法是在case中对应选项后使用shift和读后一位参数的 方法处理。更好的方法如下:
(2)使用getopt命 令
getopt命令在处理选项和参数时 非常方便。它对参数进行重新组织,以便于解析
1)命令格式
getopt可以接受任意 形式的选项和参数列表,并自动将它们转换为适当的格式。
命令格式为: getopt options optstring parameters
选项字符串(opstring)用于定义命令行 中的有效选项字母,以及哪些选项字母需要参数值。
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、获取用户输入
当需要在执 行过程中获得执行脚本人员的输入,使用read命 令
(1)基本读取
read命 令接受标准输入或其他文件描述符输入。读入后将数据放入一个标准变量中。
-p 允许在read命令行中直接指定一个提示。
可以指定多个变量,也可以不指定(将放置在REPLY环境变量中)
(2)计 时
使用-t指定一个计时器,计时数满还未输入,read返回一个非0的退出状态。
使 用-n指定输入的字符个数,输入达到预定数目时,就自动结束输入
使用 -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 ]
nomal_opts_act()
echo -e "\n### nomal_opts_act ###\n"
while [ -n "$1" ]
case "$1" in
echo "Found the -a option"
echo "Found the -b option"
echo "The parameter follow -b is $2"
echo "Found the -c option"
echo "The parameter follow -c is $2"
echo "Found the -d option"
echo "$1 is not an option"
#用shell命令自建的选项解析,可以按照自己的想法实现
#优点:自己定制,没有做不到,只有想不到
#缺点:麻烦
getopt_act()
echo -e "\n### getopt_act ###\n"
GETOPTOUT=`getopt ab:c:d "$@"`
set -- $GETOPTOUT
while [ -n "$1" ]
case $1 in
echo "Found the -a option"
echo "Found the -b option"
echo "The parameter follow -b is "$2""
echo "Found the -c option"
echo "The parameter follow -c is "$2""
echo "Found the -d option"
echo "Unknow option: "$1""
param_index=1
for param in "$@"
echo "Parameter $param_index:$param"
param_index=$[ $param_index + 1 ]
#用getopt命令解析选项和参数
#优点:相对与getopts来说是个半自动解析,自动组织选项和参数,用 -- 符号将选项与参数隔开
#缺点:相对于getopts的缺点
#1.需要与set -- 命令配合,不是必须,需要手动shift
#2.选项参数中不支持空格如 -a -b dog -c "earth moon" -d -f param1 param2 就会解析错误
getopts_act()
echo -e "\n### getopts_act ###\n"
while getopts :ab:c:d ARGS
case $ARGS in
echo "Found the -a option"
echo "Found the -b option"
echo "The parameter follow -b is $OPTARG"
echo "Found the -c option"
echo "The parameter follow -c is $OPTARG"
echo "Found the -d option"
echo "Unknow option: $ARGS"
shift $[ $OPTIND -1 ]
param_index=1
for param in "$@"
echo "Parameter $param_index:$param"
param_index=$[ $param_index + 1 ]
#getopts 命令解析选项和参数
#优点:可在参数中包含空格如:-c "earth moon"
选项字母和参数值之间可以没有空格如:-bdog
可将未定义的选项绑定到?输出
Unknow option: ?
nomal_opts_act -a -b dog -c earth -d -f param1 param2
getopts_act -a -b dog -c "earth moon" -d -f param1 param2
getopt_act -a -b dog -c earth -d -f param1 param2Shell 函数参数
来源:易贤网&& 阅读:845 次&&日期: 11:55:59
温馨提示:易贤网小编为您整理了“Shell 函数参数”,方便广大网友查阅!
在shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
带参数的函数示例:
?1 #!/bin/bash funWithParam(){ echo "The value of the first parameter is $1 !" echo "The value of the second parameter is $2 !" echo "The value of the tenth parameter is $10 !" echo "The value of the tenth parameter is ${10} !" echo "The value of the eleventh parameter is ${11} !" echo "The amount of the parameters is $# !" echo "The string of the parameters is $* !"} funWithParam 1 2 3 4 5 6 7 8 9 34 73
The value of the first parameter is 1 !
The value of the second parameter is 2 !
The value of the tenth parameter is 10 !
The value of the tenth parameter is 34 !
The value of the eleventh parameter is 73 !
The amount of the parameters is 12 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !"
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n&=10时,需要使用${n}来获取参数。
另外,还有几个特殊字符用来处理参数:
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
更多信息请查看
更多信息请查看
【】&&&&&【点此处查询各地各类考试咨询QQ号码及交流群】
易贤网手机网站地址:
由于各方面情况的不断调整与变化,易贤网提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
相关阅读 & & &
&&& &nbsp&nbsp&nbsp会员注册
本站不参与评论!()
自觉遵守:爱国、守法、自律、真实、文明的原则
尊重网上道德,遵守中华人民共和国各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的评论
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您在本站发表的评论,本站有权保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 143, 距离下一级还需 57 积分
论坛徽章:2
#!/bin/bash
PATH=/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:./:/usr/java/default/bin:/root/bin
acl_echo(){
& & & & dir=$1
& & & & dir=&${dir}&
& & & & acl_num=$(stat --format=%a $dir)
& & & & echo -ne &${acl_num}\t${dir}\n&
}
find /boot | xargs -n1 acl_echo 复制代码报错[root@admin /]# ./get_acl.sh
xargs: acl_echo: No such file or directory复制代码兄弟帮忙看下
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 83, 距离下一级还需 117 积分
论坛徽章:0
find /boot | xargs -n1 acl_echo
for item in `fond /boot`
& & acl_echo ${item}
大富大贵, 积分 11097, 距离下一级还需 8903 积分
论坛徽章:38
find /boot | xargs -n1 stat --format=&%n& && &&&%a&复制代码
富足长乐, 积分 7969, 距离下一级还需 31 积分
论坛徽章:12
本帖最后由 phanx 于
19:56 编辑
& & 如果你要获得信息的话,楼上的语句就可以了。
如果你确实需要xargs执行函数并传递给函数,那么可以这样。#!/bin/bash
PATH=/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:./:/usr/java/default/bin:/root/bin
acl_echo(){
& && &&&dir=$1
& && &&&dir=&${dir}&
& && &&&acl_num=$(stat --format=%a $dir)
& && &&&echo -ne &${acl_num}\t${dir}\n&
export -f acl_echo
find /boot | xargs -n1 bash -c 'acl_echo &$0&'复制代码最后一句也可以用find的exec来做,不用xargs.find /boot -exec bash -c 'acl_echo &$0&' {} \;复制代码
白手起家, 积分 143, 距离下一级还需 57 积分
论坛徽章:2
#!/bin/bash
set -xv
PATH=/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:./:/usr/ja
va/default/bin:/root/bin
acl_echo(){
& && &&&dir=$1
& && &&&dir=&${dir}&
& && &&&acl_num=$(stat --format=%a $dir)
& && &&&echo -ne &${acl_num}\t${dir}\n&
}
export -f acl_echo
find /root | xargs -n1 -i bash -c &acl_echo {}&复制代码最终结果是这样子的,这里其实是准备把整个系统的任意文件以及目录导出,在生产环境里布好,也可以用来作为备份以及检查,运维也要防着其它用户操作不当造成的问题,也是在处理其它用户造的问题出现的这个需求,把系统里不少目录设置成700权限了,更惨的是还不知道哪些改了,误操作,除了ROOT可以登陆系统,其它用户都不能登陆。没办法,只好找到一台正常的机器,把关键目录的权限导出,重新设置了
富足长乐, 积分 7969, 距离下一级还需 31 积分
论坛徽章:12
& & 这是个简单有效的好办法。
& &也可以直接把用户数据目录拷贝出来,然后重装就行了。正文 bash shell函数中返回任意值的四种方法
bash shell函数中返回任意值的四种方法
发布时间: & 编辑:
本文介绍下,在bash shell编程中,从函数中返回任意值的几种方法,有需要的朋友参考下。
function myfunc()&
&&& myresult='the value'&
echo $myresult&
以上方法,通过一个全局变量myresult,来保存返回值。
方法2,子程序调用
复制代码 代码示例:
function myfunc()&
&&& local& myresult='some value'&
&&& echo &$myresult&&
result=$(myfunc)&& # or result=`myfunc`&
echo $result&
以上方法,将一个shell函数作为一个子程序调用,将返回值写到子程序的标准输出,来达到返回任意字符串的目的。
方法3,通过引用返回函数值
复制代码 代码示例:
function myfunc()&
&&& local& __resultvar=$1&
&&& local& myresult='some value'&
&&& eval $__resultvar=&'$myresult'&&
myfunc result&
echo $result&
有点类似于C++中的通过引用返回函数值的做法。
以下是结合后两种方法的集大成,代码如下:
复制代码 代码示例:
function myfunc()&
&&& local& __resultvar=$1&
&&& local& myresult='some value'&
&&& if [[ &$__resultvar& ]]; then&
&&&&&&& eval $__resultvar=&'$myresult'&&
&&&&&&& echo &$myresult&&
myfunc result&
echo $result&
result2=$(myfunc)&
echo $result2
通过二者的结合,该方法的灵活性有了很大提高。您可能感兴趣的文章:鍦⊿hell涓?娇鐢ㄥ嚱鏁版枃浠讹紝寮曞叆鏂囦欢 - Just Code - ITeye鍗氬?
鍗氬?鍒嗙被锛}

我要回帖

更多关于 shell 函数参数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信