Shell——函数参数传递
调用有参函数的方法
语法:
function_name arg1 arg2 arg3 …
其中,function_name 是函数名,后面的 arg1 等 是函数的参数,要用空格隔开。
获取函数参数的个数
用户可以通过 系统变量 $# 来获取脚本的参数的个数,当然,函数也是。
[linux@localhost SkySong]$ func()
> {> echo "参数个数:$#"
> }
[linux@localhost SkySong]$ func 1 2 3 4 5 6
参数个数:6
[linux@localhost SkySong]$ func
参数个数:0
[linux@localhost SkySong]$ func Sky "Sky Song"
参数个数:2
[linux@localhost SkySong]$
当参数中含有 空格 时 要用 引号引用起来,不然会被识别成多个参数
重申,参数之间是要用 空格 隔开的
通过位置变量来接收参数值
与脚本相同,函数也可以使用 位置变量 来获取 参数
$0 表示获取脚本的名字
$1 表示获取第一个参数,$2 表示获取第二个,,以此类推
$@ 和 $* 表示获取所有参数的值
[linux@localhost SkySong]$ func()
> {> #输出所有参数
> echo "所有参数:$@"
> #输出所有参数
> echo "所有参数:$*"
> #输出脚本名称
> echo "脚本名:$0"
> #输出第一个参数
> echo "第一个参数:$1"
> #输出第二个参数
> echo "第二个参数:$2"
> }
[linux@localhost SkySong]$ func Sky Song
所有参数:Sky Song
所有参数:Sky Song
脚本名:-bash
第一个参数:Sky
第二个参数:Song
[linux@localhost SkySong]$
因为我直接在目录环境下写的,所以这里的脚本名是 -bash (父脚本)
无论是在函数中还是脚本中,$0 都是获取 脚本名,,(注)
移动位置参数
shift 命令:可以使脚本的所有参数位置向左移动一位(删除第一位,第二个参数变成了第一个,以此类推)
因为shell脚本最多定位九个变量,所以需要 shift 来获取超出9个之外的 参数
[linux@localhost SkySong]$ more shift.sh
#! bin/bash
func()
{#通过while和shift命令一次获取参数值while (($# > 0))doecho "$1"shiftdone
}
func 1 2 3 4 5 6 7 8 9 0
[linux@localhost SkySong]$ sh shift.sh
1
2
3
4
5
6
7
8
9
0
[linux@localhost SkySong]$
shift 命令会影响到系统变量 $# 的值
通过getopts 接收函数参数
getopts 是 bash 内置的一个命令,通过该命令,用户可以获取函数的选项以及参数值,或者是脚本的命令行选项以及参数值
语法:
getopts optstring [args]
optstring:是一个参数,里面包含了可以为 getopts 命令识别的选项名称列表。
注:如果某个选项名称的后面跟随着一个冒号 “:” ,则表示用户可以为该选项提供参数值。
与此同时,参数值将被保存到一个名称为 $OPTARG 的 系统变量 中。getopts 命令会依次遍历每个选项,选项名称将被保存到 args 变量中。
[linux@localhost SkySong]$ more getopts+.sh
#! bin/bashfunc()
{#逐个接收选项及其参数while getopts "s:k:y:" argdocase "$arg" ins)echo "s,,:$OPTARG";;k)echo "k,,:$OPTARG";;y)echo "y,,:$OPTARG";;?)echo "luck!"exit 1;;esacdone
}
func -s sky -k bian
[linux@localhost SkySong]$ sh getopts+.sh
s,,:sky
k,,:bian
[linux@localhost SkySong]$
上述 getopts 后面的 “s:k:y:” 是用户可以给函数提供的选项参数,每个参数还都可以含有参数,因为他们后面都加了 “:”,这个参数会被存到 系统变量 $OPTARG 中。
系统变量 $OPTARG 是一个内置的系统变量
间接参数传递
间接参数传递:是通过间接变量引用来实现函数参数的传递。
注:如果某个变量的值又是另一个变量的变量名,那么该变量称为间接变量。
例如:(某个脚本中的两个变量)
var=name
name=SkySong
可以发现,上述的变量 var 的值 是另一个变量(name)的变量名,,此时 可以通过两种方法来引用第二个变量
${name}
${!var}
这个两个表达式的结果都是 SkySong
其中第一种引用方法就是直接通过变量名来引用的,但第二种方法则是通过第一个变量名来间接地引用的。
语法:
${!var_name}
注:其中 var_name 是另外一个变量的变量名。
[linux@localhost SkySong]$ more IndirectPara.sh
#! bin/absh
func()
{echo "$1"
}
#定义变量
var=name
name=John
func "$var"
func ${!var}
name=Alice
func "$var"
func ${!var}[linux@localhost SkySong]$ sh IndirectPara.sh
name
John
name
Alice[linux@localhost SkySong]$
通过全局变量传递数据
全局变量的作用域是整个程序,包括函数内部。所以,它可以用来传递数据。
尽管这种方式是有效的,但是实现出来的程序可读性差,不建议用太多。
[linux@localhost SkySong]$ more Global_para.sh
#! bin/bash#定义全局变量
file="/bin/ls"#定义函数
func()
{if [ -e "$file" ];thenecho "文件存在!"elseecho "文件不存在!"fi
}func#修改全局变量的值
file="/bin/a"func
[linux@localhost SkySong]$ sh Global_para.sh
文件存在!
文件不存在!
总之不建议大家使用,我就不多BB了
传递数组参数
严格的讲,Shell并不支持将数组作为参数传递给函数,但是我们仍然可以通过一些变通的方法来实现数组参数的传递。
我们可以将数组的元素展开,然后作为多个由空格隔开的参数传递给函数。
[linux@localhost SkySong]$ more Array.sh
#! bin/bashfunc()
{echo "元素个数:$#"while [[ 0 -lt $# ]]doecho "$1"shiftdone
}a=(a b "c d" e)func "${a[@]}"[linux@localhost SkySong]$ sh Array.sh
元素个数:4
a
b
c d
e
[linux@localhost SkySong]$
其中 变量 ${a[@]} 可以获取数组的所有元素的值。
因为数组里的 第三个元素(“c d”),中间由空格,所以在调用函数的时候要加引号——"${a[@]}"
否则,就会被识别出多条数据。
结果会变成这样
a
b
c
d
e
That’s all , Thank you ! ! !
Shell——函数参数传递相关推荐
- 关于perl和shell的参数传递
Perl 1.命令行参数传递 *Perl **@ARGV $_ARGV[0] $#ARGV为参数的个数-1 ($#array 只适用于@array不适用%hash) *Shell $1 $2 参数个 ...
- 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】
⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...
- Shell入门教程:Shell函数详解
Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...
- Shell函数知识点大全
文章目录 一.Shell 函数 二.Shell 函数定义 三.函数返回值 四.函数传参 五.函数变量的作用范围 六.递归 1.阶乘 2.递归目录 七.函数库 一.Shell 函数 1.将命令序列按格式 ...
- linux-shell脚本-利用shell函数计算两数之和--思考return原理
一.实例1(错误代码) 在shell脚本的学习过程中,遇到定义一个带有return语句的函数,来计算两数之和,代码如下: #!/bin/bash funWithReturn(){echo " ...
- Shell 函数、数组与正则表达式
防伪码:白日依山尽,黄河入海流. 5.1 函数 格式: func() { command } 示例 1: #!/bin/bash func() { echo "This is a func ...
- linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...
摘要 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高. 高级语言都支持函数,Shell也不例外.今天就为大家介绍下Shell中函数相关用法. 函数可以将一个复杂功能划 ...
- C语言中函数参数传递
C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值. (2)地址传递,就是 ...
- shell 死循环if判断_运维小技巧(2):shell函数
shell函数是什么 shell函数可以看作是一组shell命令的组合,用来完成一个特定的功能,它的功能和java中的方法类似. 2. shell函数长什么样 铛铛铛,先上代码. function l ...
最新文章
- Linux之Vsftpd虚拟用户、扩展应用tcp_wrapper实验总结
- Linux 工程向 Windows 平台迁移的一些小小 tips
- 1010 一元多项式求导 (25 分)(c语言)
- HDU 5938 Four Operations 【字符串处理,枚举,把数字字符串变为数值】
- IntelliJ IDEA内存优化最佳实践(转)
- Win配置Apache+mod_wsgi+django环境+域名
- 单线程智能聊天机器人
- Android学习系列--App缓存管理
- Python读取Access数据库基本操作
- C++ 八股文(一)
- 桌面版微信打开链接,H5页面一片空白
- python经济统计学论文_Python商务与经济统计学-1
- IOS UIKit基础控件的使用
- 【JVM笔记】支配树(Dominator Tree)
- 美国程序员薪水按编程语言大比拼新浪
- GPS与GPRS模块功差之千里
- 修改STM32的USB程序
- 大数据基础环境搭建的从spark到hadoop,从底层硬件到上层软件的一些必备注意事项
- java多线程,卖票案例
- 如何分析一个网站的SEO情况