调用有参函数的方法

语法:

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——函数参数传递相关推荐

  1. 关于perl和shell的参数传递

    Perl 1.命令行参数传递  *Perl **@ARGV $_ARGV[0] $#ARGV为参数的个数-1 ($#array 只适用于@array不适用%hash) *Shell $1 $2 参数个 ...

  2. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】

    ⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...

  3. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  4. Shell函数知识点大全

    文章目录 一.Shell 函数 二.Shell 函数定义 三.函数返回值 四.函数传参 五.函数变量的作用范围 六.递归 1.阶乘 2.递归目录 七.函数库 一.Shell 函数 1.将命令序列按格式 ...

  5. linux-shell脚本-利用shell函数计算两数之和--思考return原理

    一.实例1(错误代码) 在shell脚本的学习过程中,遇到定义一个带有return语句的函数,来计算两数之和,代码如下: #!/bin/bash funWithReturn(){echo " ...

  6. Shell 函数、数组与正则表达式

    防伪码:白日依山尽,黄河入海流. 5.1  函数 格式: func() { command } 示例 1: #!/bin/bash func() { echo "This is a func ...

  7. linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...

    摘要 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高. 高级语言都支持函数,Shell也不例外.今天就为大家介绍下Shell中函数相关用法. 函数可以将一个复杂功能划 ...

  8. C语言中函数参数传递

    C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值. (2)地址传递,就是 ...

  9. shell 死循环if判断_运维小技巧(2):shell函数

    shell函数是什么 shell函数可以看作是一组shell命令的组合,用来完成一个特定的功能,它的功能和java中的方法类似. 2. shell函数长什么样 铛铛铛,先上代码. function l ...

最新文章

  1. Linux之Vsftpd虚拟用户、扩展应用tcp_wrapper实验总结
  2. Linux 工程向 Windows 平台迁移的一些小小 tips
  3. 1010 一元多项式求导 (25 分)(c语言)
  4. HDU 5938 Four Operations 【字符串处理,枚举,把数字字符串变为数值】
  5. IntelliJ IDEA内存优化最佳实践(转)
  6. Win配置Apache+mod_wsgi+django环境+域名
  7. 单线程智能聊天机器人
  8. Android学习系列--App缓存管理
  9. Python读取Access数据库基本操作
  10. C++ 八股文(一)
  11. 桌面版微信打开链接,H5页面一片空白
  12. python经济统计学论文_Python商务与经济统计学-1
  13. IOS UIKit基础控件的使用
  14. 【JVM笔记】支配树(Dominator Tree)
  15. 美国程序员薪水按编程语言大比拼新浪
  16. GPS与GPRS模块功差之千里
  17. 修改STM32的USB程序
  18. 大数据基础环境搭建的从spark到hadoop,从底层硬件到上层软件的一些必备注意事项
  19. java多线程,卖票案例
  20. 如何分析一个网站的SEO情况

热门文章

  1. 【杂谈Java内存Webshell的攻与防】
  2. 云脉档案管理软件,档案加工快人一步
  3. 杭州江南专修学校计算机应用,2021年杭州江南专修学院高级护理招生计划及专业介绍-升学乐中职网...
  4. 马上看懂各种内聚类型(逻辑内聚、过程内聚、顺序内聚)
  5. 中国新能源汽车产业链深度分析及投资前景规划报告2022-2027年
  6. Chris Paul
  7. 解缺芯之困 以工匠之心静待花开
  8. BOFC、BOF与BOVW
  9. 计算机视觉——BOF图像检索算法
  10. 【刷题】数据库SQL实战 [SQL02] - 查找入职员工时间排名倒数第三的员工所有信息