调用有参函数的方法
语法:
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 ! ! !