如何查看linux中函数的定义,Linux Shell(Shell中函数的定
义)
说起函数调⽤,相信⼤家也不会陌⽣,然⽽对于初学Shell的我来说,Shell中函数调⽤⽅式却有点让我不太习惯,⾃⼰也⾛了不少的弯路,因为传递参数时出了⼀个很“⾃然”的错误,也让我吃了不少的苦头,所以总结⼀下Shell中函数的调⽤⽅法。
⼀、Shell中函数的定义
为了⽅便程序和管理和模块化并减少代码的重复,函数的确是⼀个好东西。⽽Shell中函数的定义有两种⽅法,如下:
function
fname()
{
statements;
}
或
fname()
{
statements;
}
注意,()内是没有参数的,它并不像C语⾔那样,在()⾥可以有参数。
那⼤家可能就郁闷了,函数调⽤或多或少总是会需要⼀些参数,那么这些参数要怎么传递进来呢?其实参数传递⽅式为:fname;(不需要传递参数)或fname
agr1 arg2(需要传递两个参数);
⼆、⾃定义函数的例⼦
linux下的sleep函数不知道⼤家的情况如何,反正⼀开始我就觉得很别扭,因为在C语⾔中,例如我定义⼀个函数int cmp(int a, int
b),那么我就会在函数中使⽤到函数头中声明的变量a和b,⽽在Shell中却没有定义参数,那我的函数⼜需要⽤到这两个参数,怎么办好呢?下⾯就⽤⼀个例⼦来说明好了。
#! /bin/bash
# Filename:LoopPrint.sh
function LoopPrint()
{
count=0;
while [ $count -lt $1 ];
do
echo $count;
let ++count;
sleep 1;
done
return 0;
}
read -p "Please input the times of print you want: " n;
LoopPrint $n;
#! /bin/bash
# Filename:LoopPrint.sh
function LoopPrint()
{
count=0;
while [ $count -lt $1 ];
do
echo $count;
let ++count;
sleep 1;
done
return 0;
}
read -p "Please input the times of print you want: " n;
LoopPrint $n;
先来说说这个程序的功能吧,就是输⼊⼀个数字n,然后从0开始每隔1秒输⼊⼀个数字,直到输出n-1为⽌。⾸先,程序会要求你输⼊⼀个数学,然后调⽤函数来进⾏输出的功能。
注意注释1的那⼀句,⾥⾯有⼀个变量$1,⼤家应该还记得调⽤函数时参数的传递⽅式,即fname agr1
arg2,这⾥的$1就是表⽰第⼀个参数,依此类推,$2就是第⼆个参数,$3就是第3个参数,$n就是表⽰第n个参数。
所以$1就是变量n的值。这样说⼤家懂了吧!
补充⼀下,就是:
$0:是脚本本⾝的名字;
$#:是传给脚本的参数个数;
$@:是传给脚本的所有参数的列表,即被扩展为"$1" "$2" "$3"等;
$*:是以⼀个单字符串显⽰所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成"$1c$2c$3",其中c是IFS的第⼀个字符;
$$:是脚本运⾏的当前进程ID号;
$?:是显⽰最后命令的退出状态,0表⽰没有错误,其他表⽰有错误;
特别注意,传递参数时,(这个例⼦中)⼀定要写成LoopPrint
$n;⽽不能写成LoopPrint
n。为什么?例如你输⼊的是20,则n的值($n)为20,前者表⽰的是把n的值,即20传递给函数LoopPrint,⽽后者则表⽰把字符n传递给函数LoopPrint。这点与在静态语⾔中的函数参数传递是很不同的,因为在Shell中变量的使⽤并不需要先定义,所以要使⽤变量,让Shell 知道它是⼀个变量,并要传递它的值时,就是⽤$n,⽽不能直接⽤n,否则只把n当作⼀个字符来处理,⽽不是⼀个变量。
三、作⽤域问题
函数的作⽤域与C/C++语⾔中的作⽤约束是⼀样的,函数的定义⼀定要出现在函数的调⽤语句之前,但是有⼀点跟C/C++中不⼀样的就是变量的作⽤域问题,经过本⼈的试验,在注释1的语句改为while
[ $count -lt $n ];也是可⾏的,即函数可以使⽤本⽂件中出现的任何变量,但是本⼈还是建议使⽤上⾯例⼦中的⽅法,即while
[ $count -lt $1
],并且不要随意使⽤函数中的变量之外的变量,因为你并不⼀定知道你调⽤函数时函数外有什么变量存在也不知道它的值是什么,也不能保证别⼈在使⽤你的函数时会传递你在函数中使⽤到的变量名,如这⾥的n,别⼈在使⽤时可能传递的就是他⾃⼰定义的变量,如Count 等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论