{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-02-08 11:35:40","updateBy":"admin","updateTime":"2025-06-16 20:18:32","remark":null,"id":47,"articleTitle":"Shell（六）函数","articleUrl":"shell_function","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/7769fde9ec5445068e41583cb1c71894.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"shell函数的本质是一段可以重复使用的脚本代码，这段代码被提前编写好，放在指定位置，使用时直接调用即可。shell中的函数和C++、JAVA、Python等其他编程语言中的函数类似，只是在语法中有所差别。","articleContent":"## 函数定义\n\nshell函数的本质是一段可以重复使用的脚本代码，这段代码被提前编写好，放在指定位置，使用时直接调用即可。shell中的函数和C++、JAVA、Python等其他编程语言中的函数类似，只是在语法中有所差别。\n\n### 函数格式\n\n```bash\nfunction name() {\n\t命令\n\treturn value\n}\n```\n\n**说明：**\n\n- function是shell中的关键字，专门用来定义函数。\n- name是函数名。\n- return返回值，取值范围是0-255。可不写。\n- { }内为函数体，即这个函数实际执行的部分。\n\n### 简化写法\n\n```bash\nname() { # function关键字可以不写\n\t命令\n\treturn value\n}\n或\nfunction name { # 如果写了function关键字的话可以省略函数名后的括号\n\t命令\n\treturn value\n}\n```\n\n## 函数调用\n\nshell函数是解释性语言，函数必须先定义后调用，即函数必须写在前面才能在后面调用。定义函数的代码段不会自动执行，而是在调用时执行；调用时不用带上()；调用 Shell 函数时可以给它传递参数，也可以不传递。如果不传递参数，直接给出函数名字即可。\n\n```bash\n#!/bin/bash\nfunction hello() {\n\techo \"hello world\"\n}\n# 调用上面定义的hello函数\nhello\n```\n\n## 函数变量\n\nshell函数中的变量的作用域同样分为两种：\n\n局部变量，作用域是函数的生命周期，在函数结束时被自动销毁。定义局部变量的方法：`local var=value`。\n\n本地变量，作用域是运行脚本的shell进程的生命周期，也就是当前shell。\n\n```bash\n#!/bin/bash\nvar=\"hello world\"\nvars() {\n\tvar=\"hello xiaoming\"\n}\necho $var\nvars\necho $var\n# 执行脚本查看输出\n[root@l1 ~]# ./vars.sh \nhello world\nhello xiaoming\n```\n\n可以看到var变量的值被函数改变了，在大部分情况不会有问题，但如果是PATH类似的重要变量就不能这样定义了，需要定义成局部变量。\n\n```bash\n#!/bin/bash\nvar=\"hello world\"\nvars() {\n\tlocal var=\"hello xiaoming\"\n\techo $var\n}\necho $var\nvars\necho $var\n# 执行脚本查看输出\n[root@l1 ~]# ./vars.sh \nhello world\nhello xiaoming\nhello world\n```\n\n## 函数传参\n\n函数需要参数时可以像普通的shell脚本一样定义$n为第n个参数，同样支持$、$#等。调用函数时直接在函数名后输入需要的参数，多个参数用空格分隔即可。\n\n```bash\nfunname param1 param2 param3\n```\n\n```bash\n#!/bin/bash\nvars() {\necho \"第一个参数为$1\"\necho \"第一个参数为$2\"\necho \"参数共$#个\"\n}\nvars 1 2 a b c d\n# 查看脚本执行结果\n[root@l1 ~]# ./vars.sh \n第一个参数为1\n第一个参数为2\n参数共6个\n```\n\n## 函数返回值\n\nshell中有退出状态码，0为命令执行成功，1-255为命令执行错误，shell中执行的最后一条命令的退出状态码可以用$?查看。在脚本中我们也可以自定义退出状态码，通过命令exit实现；函数中则使用return命令实现。\n\n### return语句\n\nShell 函数返回值只能是整形数值，一般是用来表示函数执行成功与否的，0表示成功，其他值表示失败。用函数返回值来返回函数执行结果是不合适的。如果return某个计算结果，比如一个字符串，往往会得到错误提示：`numeric argument required`。\n\n```bash\n#!/bin/bash\nadd() {\n\ts=$[$1 + $2]\n\treturn $s\n}\nadd 1 2\necho $?\n[root@l1 ~]# ./add.sh \n3\n可以看到如果把两个数相加的结果作为返回值，就可以用$?获得，但是这种将计算结果作为函数返回值的方式只能得到255内的结果。\n```\n\n### 获取函数返回值\n\n方式一：用$?获得\n\n方式二：将函数作为命令执行获得标准输出\n\n```bash\n#!/bin/bash\nget() {\n\treturn \"string\"\n}\n\necho `get`\necho $(get) # 这种方式同样适用于需要传参的函数\n```","categoryId":5,"viewCount":626,"categoryName":"Shell","author":"球接子","authorAvatar":null,"tagIds":[4,10],"tagNames":["Shell","Linux基础"]}}