专业编程基础技术教程

网站首页 > 基础教程 正文

Bash函数用法(2):从函数中返回整数值和字符串

ccvgpt 2024-10-12 14:07:05 基础教程 8 ℃

本系列文章介绍在 Linux Bash shell 中使用函数的一些实例,包括下面的内容:

  • 定义函数的格式
  • 从函数中返回内容
  • 使用函数名作为函数指针
  • 函数内执行cd命令的影响
  • 声明函数内的变量为局部变量
  • 获取传入函数的所有参数

从函数中返回内容

Bash 要求函数的返回值必须为一个整数,不能用 return 语句返回字符串变量。一般来说,该整数返回值为 0,表示函数执行成功,非0 表示执行失败。

Bash函数用法(2):从函数中返回整数值和字符串

在自定义的函数里面,执行 return 语句会退出函数,不会退出整个脚本。在函数里面执行 exit 语句则会退出整个脚本,而不是只退出函数。

由于在函数内部用 return 返回,只能返回整数。如果想从函数内部把字符串传递到函数之外,可以用 echo 命令来实现,就是在函数内部打印字符串,然后调用者获取标准输出获取到打印的字符串。举例如下:

$ function foo() { echo "foo"; return 0; }
$ var=$(foo)
$ echo ${var}, $?
foo, 0

可以看到,打印结果是 "foo, 0"。

此时看起来,这个函数像是返回了两个值,一个是通过 $(foo) 获取 foo 函数的标准输出,另一个是 $? 会获取函数通过 return 语句返回的 0。

如果在函数中写为 return 1,那么上面的 $? 打印的出来的值是 1。

下面再举例说明如下:

$ foo() { echo "foo"; }
$ bar() { foo; }
$ foobar() { a=$(foo); }
$ var=$(foo); echo first: ${var}
first: foo
$ var=$(bar); echo second: ${var}
second: foo
$ var=$(foobar); echo third: ${var}
third:

可以看到, foo 函数将字符串写到标准输出,var=$(foo); 语句把 foo 函数的标准输出赋值给 var 变量,打印 var 变量的值是 "foo"。

而 bar 函数调用了 foo 函数,但是没有读取 foo 函数打印的标准输出,则这个标准输出会被 bar 函数继承,就好象这个标准输出是由 bar 函数输出一样,var=$(bar); 语句也会把 var 变量赋值为 "foo"。

最后,foobar 函数读取了 foo 函数的标准输出,foobar 函数自身没有用 echo 命令来输出内容,此时再通过 $(foobar) 来获取该函数的输出,会获取到空,因为 foo 函数中的标准输出给 foobar 读走了。

注意:这种在函数内部通过 echo 命令输出字符串的做法有个缺陷,就是不能再在函数里面执行 echo 语句来打印调试信息,这些调试信息会被函数外的语句一起读取到,有用的结果和调试信息都混在一起,如果函数外的语句没有打印这些结果,就会看不到调试信息。

执行某个函数后,可以使用 $? 表达式来获取函数的 return 返回值,但是要注意下面的一种情况:

var=$(foo)
if [ "$?" == "0" ]; then
 echo success
fi

此时,不要在 var=$(foo) if [ "$?" == "0" ]; then 之间添加任何语句!否则,$? 获取到将不是 $(foo) 的 return 值,判断就有问题,特别是不要添加 echo 调试语句。

换句话来说,这种先执行一个语句,再判断 $? 的方法不是很可靠,会受到各种影响,要特别注意代码语句的顺序。

PS:未完待续,下篇文章会继续说明,敬请期待~

Tags:

最近发表
标签列表