# 创建函数

格式

# 格式 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 启动时会执行一下。

更新于