函数的定义
- function fname(){
- }
或者
- function_name(){
- }
对于简单的函数, 甚至可以是这样做 fname() { statement; }
函数调用
直接写函数名即可. 如 fname
传参给函数
传入的参数都是位置参数, 无法传入形式参数以及设置默认参数, 传入位置的参数如下:
fname arg1 arg2
简单的函数例子如下:
- fname(){
- echo $1, $2; #访问参数 1 和参数 2
- echo "[email protected]"; #以列表的方式一次性打印所有参数
- echo "$*"; #类似于 [email protected], 但是所有参数被视为单个实体
- return 0; #返回值
- }
- fname a b
解释下不常见的参数:
"[email protected]" 被扩展成 "$1" "$2" "$3" 等.
"$*" 被扩展成 "$1c$2c$3" , 其中 c 是 IFS 的第一个字符.
IFS 解释:
IFS 是 shell 脚本中的一个重要概念, 在处理文本数据时, 它是相当有用的. IFS 可以是 White Space(空白键),Tab( 表格键),Enter( 回车键) 中的一个或几个.
IFS(Internal Field Seperator) 在 Linux 的 shell 中预设的分隔符, 用来把 command line 分解成 Word(字段).
IFS 的设置方法很简单, 和普通变量设置方法类似:
IFS=":"
建议设置 IFS 前保存原 IFS 的值, 在使用后及时恢复.
别名的位置参数
通过设置别名的方法设置一个命令, 然后传入参数进去看看有什么效果
- [[email protected] tmp]# alias lsg='ls |grep'
- [[email protected] tmp]# lsg sh
- DaoJiShi.sh
- debugsh.sh
- testFunc.sh
- testSet.sh
我们再写一个函数, 接受一个位置参数, 由此可以对比下别名的位置参数和函数的位置参数
- [[email protected] tmp]# getFile(){
- ls |grep $1 ;
- }
- [[email protected] tmp]# getFile txt
- output.txt
- [[email protected] tmp]# getFile sh
- DaoJiShi.sh
- debugsh.sh
- testFunc.sh
- testSet.sh
函数的扩展知识
递归函数
在 Bash 中, 函数同样支持递归调用 (可以调用自身的函数). 例如, F() { echo $1; F hello;
sleep 1; } .
Fork 炸弹
递归函数是能够调用自身的函数. 这种函数必须有退出条件, 否则就会不断地
生成自身, 直到系统耗尽所有的资源或是崩溃.
:(){ :|:& };:
这个函数会一直地生成新的进程, 最终形成拒绝服务攻击.
函数调用前的 & 将子进程放入后台. 这段危险的代码能够不停地衍生出进程,
因而被称为 Fork 炸弹.
可以通过修改配置文件 / etc/security/limits.conf 中的 nproc 来限制可生成的最
大进程数, 进而阻止这种攻击.
下面的语句将所有用户可生成的进程数限制为 100:
hard nproc 100
导出函数
通过 export -f fname 导出函数, 如此一来, 函数的作用域就可以扩展到子进程中, 也就是子进程也可以使用这个函数了.
- [[email protected] tmp]# cat testExportFunc.sh
- getFile sh
- [[email protected] tmp]# sh testExportFunc.sh
- testExportFunc.sh: line 1: getFile: command not found
- [[email protected] tmp]# export -f getFile
- [[email protected] tmp]# sh testExportFunc.sh
- DaoJiShi.sh
- debugsh.sh
- testExportFunc.sh
- testFunc.sh
- testSet.sh
读取命令返回值
读取 $? 获得返回值, 如果命令成功退出, 那么退出状态为 0, 否则为非 0.
向命令传递参数
在脚本中, 命令行参数可以依据其在命令行中的位置来访问. 第一个参数是 $1 , 第二个参数
是 $2 , 以此类推.
下面的语句可以显示出前 3 个命令行参数:
echo $1 $2 $3
更为常见的处理方式是迭代所有的命令行参数. shift 命令可以将参数依次向左移动一个位
置, 让脚本能够使用 $1 来访问到每一个参数. 下面的代码显示出了所有的命令行参数:
- $ cat showArgs.sh
- for i in `seq 1 $#`
- do
- echo $i is $1
- shift
- done
- $ sh showArgs.sh a b c
- 1 is a
- 2 is b
- 3 is c
来源: http://www.bubuko.com/infodetail-3201200.html