美文网首页
Shell 函数深入解析与实践

Shell 函数深入解析与实践

作者: 左诗右码 | 来源:发表于2024-06-18 22:34 被阅读0次

在本文中,我们将深入探讨 Shell 函数的定义、参数传递、以及如何正确获取函数运算结果。

本教程旨在为刚入门的新手提供明晰的指南,同时也为有一定编程基础的开发者提供深入理解 shell 函数的机会。我们将通过实际代码示例,逐步展开讨论,以确保概念的清晰传达和理解。

定义函数

在 Shell 脚本中,定义函数的语法有几种形式,尽管它们在表现形式上略有不同,但实际上是等价的。以下是定义函数的三种基本方式:

定义 shell 函数时 不能 指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。


# 标准的函数写法
function func() {
    return 'demo-test'  # 可以写 return 语句,也可以不写
}


# 也可以不写 function 关键字
func() {
    return 'demo-test'
}

# 还可以直接省略掉函数名后面的小括号
function func {
    return 'demo-test'
}

注意:在 Shell 中,return 语句用于返回函数的退出状态码,而非返回数据值。如果需要返回数据值,通常是通过 echo 或者全局变量的方式。

给函数传递位置参数

当我们调用函数时,可以向其传递位置参数。在 Shell 函数内部,这些参数可以通过 $1, $2, $3 等特殀变量访问。如果参数数量超过 9 个,需要使用花括号,例如 ${10}, ${11}

#!/bin/bash

# 定义函数
function func() {
    echo "$1"
    echo "$2"  # 接收位置参数并打印
}

# 调用函数,传递两个参数
func name alex # 输出: name alex

计算函数参数的和

我们还可以定义一个函数,来计算传入参数的和。通过使用特殊变量 $@,我们可以接收函数的所有参数。

#!/bin/bash

sum=100  # 全局变量

function cal_sum() {
  local sum=0  # 使用 local 关键字定义局部变量

  for n in $@  # 遍历所有参数
  do
    ((sum+=n))  # 累加参数值
  done

  echo $sum  # 打印局部变量 sum 的值
  return 0
}

total=$(cal_sum 10 20 30 40)
echo $total  # 输出: 100

# 返回函数的退出状态
echo $?  # 输出: 0

获取函数的返回值

在 Shell 中,使用特殊变量 $? 可以获取上一个命令的退出状态码。但需要注意的是,使用 return 返回大于 255 的数值时会出现问题,因为返回值是一个 8 位的数,范围从 0 到 255。

$? 可以用来获取上一个命令的退出状态,但使用它来获取函数的返回值是一种错误的方式。这是因为 $? 只能捕获命令的退出状态,而不是函数的 return 语句的值:

#!/bin/bash

function add(){
    return `expr $1 + $2`
}

add 11 22  # 调用函数
echo $?  # 输出可能是上一个命令的退出状态,而不是函数的返回值

重要提示:在 Shell 编程中,将 $? 用于获取函数的“返回值”(在这里实质上是退出状态码)通常不是获取函数执行结果的正确方法,尤其是如果你想要获取的是函数处理的具体数据结果。相反,应该通过 echo 等命令将结果输出,并在函数外部通过命令替换的方式将其捕获到变量中。

正确的返回值获取方式

要正确获取函数的返回值,应该使用函数的 return 语句,并在函数调用后立即检查 $?

#!/bin/bash

function add(){
    return $(($1 + $2))  # 使用 $(( )) 进行算术运算
}

add 11 22  # 调用函数
result=$?  # 正确获取函数的返回值
echo $result  # 输出:33

通过本文的学习,希望你能对 Shell 函数的相关概念有了更深入的理解,并能在实际的脚本编写中运用这些知识。记住,实践是学习的关键,不要害怕尝试和犯错!

相关文章

  • shell-case语句-函数

    1.shell函数 1.1 函数的作用 1.2 函数的语法介绍 1.3 简单实践 调用函数非常简单, 只需要在脚本...

  • 2019-09-19

    Shell 概述 Shell 解析器 查看系统shell解析器 默认解析器为bash Shell 脚本入门 新建h...

  • 2019-06-26

    [toc] 网址 深入理解程序构造 LMA与VMA总结 ELF文件解析和加载(附代码) Linux及安全实践四——...

  • js函数、变量和函数预解析

    函数基础 函数的调用 函数与解析

  • spark-shell 深入解析

    并继承了Scala REPL(读取-求值-打印-循环)(Read-Evaluate-Print-Loop)的所有功能。

  • getopts 解析bash 命令行参数

    getopts 解析bash 命令行参数 Shell脚本中的一项常见任务是解析命令行参数。 Bash提供了内置函数...

  • js函数

    函数 函数就是重复执行的代码片。函数定义与执行 变量与函数预解析: JavaScript解析过程分为两个阶段,先是...

  • js函数

    函数 函数就是重复执行的代码片。函数定义与执行 变量与函数预解析: JavaScript解析过程分为两个阶段,先是...

  • 深入浅出Linux系列

    深入浅出-Linux-001 命令解析器 shell--Unix系统 bash-- Linux系统 终端Termi...

  • shell脚本中的函数与子shell

    shell脚本中的函数与子shell 函数 函数的使用 bash中也有函数。一个函数就是一个子程序,是用于实现一串...

网友评论

      本文标题:Shell 函数深入解析与实践

      本文链接:https://www.haomeiwen.com/subject/itmgqjtx.html