调用有参函数的方法

语法:

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))
 do
  echo "$1"
  shift
 done
}
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/bash

func()
{
 #逐个接收选项及其参数
 while getopts "s:k:y:" arg
 do
  case "$arg" in
  s)
   echo "s,,:$OPTARG"
   ;;
  k)
   echo "k,,:$OPTARG"
   ;;
  y)
   echo "y,,:$OPTARG"
   ;;
  ?)
   echo "luck!"
   exit 1
   ;;
  esac
 done
}
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" ];then
  echo "文件存在!"
 else
  echo "文件不存在!"
 fi
}

func

#修改全局变量的值
file="/bin/a"

func
[linux@localhost SkySong]$ sh Global_para.sh 
文件存在!
文件不存在!

总之不建议大家使用,我就不多BB了

传递数组参数

严格的讲,Shell并不支持将数组作为参数传递给函数,但是我们仍然可以通过一些变通的方法来实现数组参数的传递。

我们可以将数组的元素展开,然后作为多个由空格隔开的参数传递给函数。

[linux@localhost SkySong]$ more Array.sh 
#! bin/bash

func()
{
 echo "元素个数:$#"
 while [[ 0 -lt $# ]]
 do
  echo "$1"
  shift
 done
}

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 ! ! !