# 创建函数
格式
# 格式 1 | |
function name { | |
commands | |
} | |
# 格式 2, 更推荐使用 | |
name() { | |
commands | |
} | |
# 使用时只需要使用函数名即可 --name |
默认情况下,函数退出状态码是函数中最后一条命令返回的退出状态码,函数执行结束后,可以用标准变量 $?
来确定函数退出状态码。
# return 语句 | |
fun() { | |
read -p "please input the value:" value | |
return $value | |
} |
退出状态码在 0~255
,否则就会返回错误值
#!/bin/bash | |
fun() { | |
var='abc' # 会报错:line 5: return: abc: numeric argument required | |
return $var | |
} | |
fun | |
# 如果中间有其他命令,$? 就会被置 0 | |
echo $? |
当然,如果希望从函数那得到一个任意对象,就像强类型语言那样 return
语句返回值可以用变量接收
fun() { | |
value=10 | |
echo $[$value*2] | |
} | |
reslut=`fun` #或者是 $(fun) |
如此可以获得任何类型的函数输出,并将其保存在变量中。
# 函数中使用变量
传参:
bash shell
会将函数当成一个小型脚本来对待,也就是说,可以传递参数,如同脚本一样。- 如同脚本一样,对于传入参数,依旧是使用
$0,$1...
,$#
是传入参数数量。value=$(fun 10 15)
, 参数直接写在后面即可。 - 由于函数使用特殊参数环境变量作为自己的参数值,因此他无法直接获取脚本在命令行获取的参数值。
处理变量:
比较麻烦的就是变量的作用域。默认情况下,定义的变量都是全局变量,函数外定义的变量,函数内部也可以正常使用。函数内定义的变量函数外也可以使用。
#!/bin/bash | |
fun() { | |
var=10 | |
return $var | |
} | |
fun | |
echo $var |
函数内部使用的任何变量都可以被声明成局部变量,只需要加上 local
关键字即可。
local temp=$[$value + 2]
, 在函数内使用 temp
,不会影响主体脚本的 temp
的值。
# 数组
arr=(one two three) |
直接 $arr
只会显示 one
,使用格式为: ${arr[1]}
, 一次性全部显示,就是 ${arr[*]}
。
#!/bin/bash | |
fun() { | |
local arr=(1,2,3,4) | |
for i in ${arr[*]} | |
do | |
echo -n $i | |
done | |
echo | |
} | |
fun | |
#结果:1,2,3,4 |
# 创建库
总有一些方法,我在很多脚本文件中都会使用,为了避免每个脚本文件都写一次, bash shell
允许创建函数库文件,然后在多个脚本中引用。
我们在运行一个脚本文件时,当前的 shell
会创建一个新的 shell
运行
cyan@cyan-virtual-machine:~/Templates$ cat testfile | |
#!/bin/bash | |
while var=10 | |
do | |
var=10 | |
done | |
cyan@cyan-virtual-machine:~/Templates$ ./testfile & | |
[1] 89708 | |
cyan@cyan-virtual-machine:~/Templates$ ps --forest | |
PID TTY TIME CMD | |
88948 pts/1 00:00:00 bash | |
89708 pts/1 00:00:08 \_ testfile | |
89710 pts/1 00:00:00 \_ ps |
shell
函数仅仅在定义它的 shell
会内有效,所以如果在 shell
命令行界面的提示符下运行库函数脚本, shell
会创建一个新的 shell
运行。这个 shell
会重新定义库函数,当其他脚本想用时,是不能的。
cat test | |
#!/bin/bash | |
./funs_file | |
.. |
哪怕在 test
中运行 funs_file
库文件,这些库函数,也只能在运行库文件的 shell
里面才会生效。
# source 命令
该命令会在当前 shell
上下文执行命令,而不是创建一个新的 shell
,并且 source
命令有个快捷别名 -- 点操作符. ./fun_file
。
编写一个脚本
cyan@cyan-virtual-machine:~/Templates$ cat testfile | |
#!/bin/bash | |
var=10 |
如果不使用 source
命令,那么 var
对于当前 shell
是不可见的
cyan@cyan-virtual-machine:~/Templates$ ./testfile | |
cyan@cyan-virtual-machine:~/Templates$ echo $var |
使用之后
cyan@cyan-virtual-machine:~/Templates$ . ./testfile | |
cyan@cyan-virtual-machine:~/Templates$ echo $var | |
10 |
# 终端使用函数
格式
# 格式 1,分号结尾 | |
fun(){echo "ok";read value;} | |
# 格式 2 | |
fun() { | |
> echo "adc" | |
> } |
在 .bashrc
文件定义函数:函数定义放在一个特殊的位置,每次启动新 shell
都会由 shell
重新在 .bashrc
中定义的函数,甚至可以在自己写的脚本中直接使用。
关于 .bashrc
,就是个启动文件, shell
启动时会执行一下。