侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Shell脚本编程(13)之函数的返回值

zze
zze
2019-12-24 / 0 评论 / 0 点赞 / 632 阅读 / 3324 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。

bash shell 会把函数当作一个小型脚本,运行结束时会返回一个退出状态码。
有 3 种不同的方法来为函数生成退出状态码。

默认退出状态码

默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。在函数执行结束后,可以用标准变量 $? 来确定函数的退出状态码。

$ cat test2.sh 
#!/bin/bash
func1() {
	echo "trying to display a non-existent file"
	ls -l badfile
}
echo "testing the function: "
func1
echo "The exit status is: $?"
$ ./test2.sh 
testing the function: 
trying to display a non-existent file
ls: cannot access badfile: No such file or directory
The exit status is: 2

函数的退出状态码是 1,这是因为函数中的最后一条命令没有成功运行。但你无法知道函数中其他命令中是否成功运行。看下面的例子。

$ cat test2a.sh 
#!/bin/bash
func1() {
	ls -l badfile
	echo "This was a test of a bad command"
}
echo "testing the function:"
func1
echo "The exit status is: $?"
$ ./test2a.sh 
testing the function:
ls: cannot access badfile: No such file or directory
This was a test of a bad command
The exit status is: 0

这次,由于函数最后一条语句 echo 运行成功,该函数的退出状态码就是 0,尽管其中有一条命令并没有正常运行。使用函数的默认退出状态码是很危险的。幸运的是,有几种办法可以解决这个问题。

使用return命令

bash shell 使用 return 命令来退出函数并返回特定的退出状态码。 return 命令允许指定一个整数值来定义函数的退出状态码,从而提供了一种简单的途径来编程设定函数退出状态码。

$ ./test3.sh 
Enter a value: 2
doubling the value
The new value is 4
$ cat test3.sh 
#!/bin/bash
function dbl {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
dbl
echo "The new value is $?"
$ ./test3.sh 
Enter a value: 2
doubling the value
The new value is 4

dbl 函数会将 $value 变量中用户输入的值翻倍,然后用 return 命令返回结果。脚本用 $? 变量显示了该值。
但当用这种方法从函数中返回值时,要小心了。记住下面两点来避免问题:

  • 记住,函数一结束就取返回值;
  • 记住,退出状态码必须是 0~255

如果在用 $? 变量提取函数返回值之前执行了其他命令,函数的返回值就会丢失。记住, $? 变量会返回执行的最后一条命令的退出状态码。
第二个问题界定了返回值的取值范围。由于退出状态码必须小于 256,函数的结果必须生成一个小于 256 的整数值。任何大于 256 的值都会产生一个错误值。

$ ./test3.sh 
Enter a value: 150
doubling the value
The new value is 44

要返回较大的整数值或者字符串值的话,你就不能用这种返回值的方法了。

使用函数输出

正如可以将命令的输出保存到 shell 变量中一样,你也可以对函数的输出采用同样的处理办法。可以用这种技术来获得任何类型的函数输出,并将其保存到变量中:

result='dbl'

这个命令会将 dbl 函数的输出赋给 $result 变量。下面是在脚本中使用这种方法的例子。

$ ./test4.sh 
Enter a value: 200
The new value is 400
$ cat test4.sh 
#!/bin/bash
function dbl {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"
$ ./test4.sh 
Enter a value: 250
The new value is 500

新函数会用 echo 语句来显示计算的结果。该脚本会获取 dbl 函数的输出,而不是查看退出状态码。
这个例子中演示了一个不易察觉的技巧。你会注意到 dbl 函数实际上输出了两条消息。 read 命令输出了一条简短的消息来向用户询问输入值。 bash shell 脚本非常聪明, 并不将其作为 STDOUT 输出的一部分,并且忽略掉它。如果你用 echo 语句生成这条消息来向用户查询,那么它会与输出值一起被读进 shell 变量中。
通过这种方式,你还可以返回浮点值和字符串值。这使它成为一种获取函数返回值的强大方法。

0

评论区