开发者俱乐部
标题: shell教程之五 返回值 [打印本页]
作者: ismeng 时间: 2016-3-13 15:03
标题: shell教程之五 返回值
[size=1.166em]Bash 有一个 shopt[size=1.166em]内建命令可用来设置或取消设置许多 shell 选项。其中一个选项是 nocasematch[size=1.166em],如果设置了该选项,它会告诉 shell 在字符串匹配中忽略大小写。您的第一个想法可能是使用您在 test[size=1.166em]命令中学到的 -o[size=1.166em]操作数。不幸的是,nocasematch[size=1.166em]不是可以使用 -o[size=1.166em]测试的选项,所以您必须采用不同的方法。[size=1.166em]您之前学到的测试不是能返回值的唯一测试。举例而言,if语句可测试基础 test命令的返回值是 true (0) 还是 false(非 0)。即使您使用了 test 以外的命令,成功和失败也分别由返回值 0和非零返回值表示。像大部分 UNIX 和 LInux 命令一样,shopt命令将会设置一个可以使用 $?检查的返回值。
[size=1.166em]掌握这项知识后,您现在可以测试 nocasematch选项,如果尚未设置它,请设置它,然后在您的函数终止时将该设置恢复为用户的首选项。shopt命令有 4 个方便的选项:-pqsu:打印当前值,不打印任何内容,设置该选项或取消设置该选项。-p和 -q选项设置一个返回值 0,用该值表示 shell 选项已设置,设置 1来表示它未设置。-p选项打印出了将该选项设置为当前值需要使用的命令,而 -q选项简单地将返回值设置为 0或 1。 清单 18显示了您修改 myorder函数所需的基本用法示例,其中使用了您之前在 [[ ]]中看到的模式匹配。
清单 18. 使用 shopt- ian@attic-u15:~$ # nocasematch starts out unset
- ian@attic-u15:~$ shopt -p nocasematch ; echo $?
- shopt -u nocasematch
- 1
- ian@attic-u15:~$ # test it
- ian@attic-u15:~$ [[ "abc" = "ABC" ]] ;echo $?
- 1
- ian@attic-u15:~$ # set nocasematch
- ian@attic-u15:~$ shopt -s nocasematch ; echo $?
- 0
- ian@attic-u15:~$ # test the pattern again
- ian@attic-u15:~$ [[ "abc" = "ABC" ]] ;echo $?
- 0
- ian@attic-u15:~$ # restore nocasematch
- ian@attic-u15:~$ shopt -u nocasematch ; echo $?
- 0
复制代码
[size=1.166em]如 清单 19所示,修改后的 myorder函数现在可以使用来自 shopt的返回值来:
- 设置一个表示 nocasematch选项的当前状态的局部变量。
- 设置该选项。
- 返回 case命令。
- 将 nocasematch选项重设为它的原始值。
清单 19. 测试来自 shopt命令的返回值- ian@attic-u15:~$ type myorder
- myorder is a function
- myorder ()
- {
- local restorecase;
- if shopt -q nocasematch; then
- restorecase="-s";
- else
- restorecase="-u";
- shopt -s nocasematch;
- fi;
- case "$*" in
- "coffee" | "decaf")
- echo "Hot coffee coming right up"
- ;;
- "tea")
- echo "Hot tea on its way"
- ;;
- "soda")
- echo "Your ice-cold soda will be ready in a moment"
- ;;
- *)
- echo "Sorry, we don't serve that here"
- ;;
- esac;
- shopt $restorecase nocasematch
- }
- ian@attic-u15:~$ shopt -p nocasematch
- shopt -u nocasematch
- ian@attic-u15:~$ # nocasematch is currently unset
- ian@attic-u15:~$ myorder DECAF
- Hot coffee coming right up
- ian@attic-u15:~$ myorder Soda
- Your ice-cold soda will be ready in a moment
- ian@attic-u15:~$ shopt -p nocasematch
- shopt -u nocasematch
- ian@attic-u15:~$ # nocasematch is unset again after running the myorder function
复制代码
[size=1.166em]如果您想您的函数(脚本)返回其他函数或命令可以测试的值,那么可以在您的函数中使用 return 语句。 清单 20展示了如何为一种您可以销售的饮品返回 0,如果客户请求其他商品,则返回 1。
清单 20. 设置您自己的函数返回值- ian@attic-u15:~$ type myorder
- myorder is a function
- myorder ()
- {
- local restorecase;
- rc=0;
- if shopt -q nocasematch; then
- restorecase="-s";
- else
- restorecase="-u";
- shopt -s nocasematch;
- fi;
- case "$*" in
- "coffee" | "decaf")
- echo "Hot coffee coming right up"
- ;;
- "tea")
- echo "Hot tea on its way"
- ;;
- "soda")
- echo "Your ice-cold soda will be ready in a moment"
- ;;
- *)
- echo "Sorry, we don't serve that here";
- rc=1
- ;;
- esac;
- shopt $restorecase nocasematch;
- return $rc
- }
- ian@attic-u15:~$ myorder coffee;echo $?
- Hot coffee coming right up
- 0
- ian@attic-u15:~$ myorder milk;echo $?
- Sorry, we don't serve that here
- 1
复制代码
[size=1.166em]如果没有指定您自己的返回值,返回值将是执行的上一个命令的返回值。函数和脚本有一种在您从未考虑到的情况下被重用的倾向,所以一种好的做法是设置您自己的值。
[size=1.166em]命令可以返回 0和 1以外的值,而且有时您需要额外的信息。例如,如果模式匹配,grep命令将会返回 0;如果不匹配,则会返回 1;但是,如果模式无效或文件规范与任何文件都不匹配,则会返回 2。如果需要区分成功 (0) 或失败(非 0)以外的返回值,可以使用 case命令或一个包含多个 elif部分的 if命令。
欢迎光临 开发者俱乐部 (http://xodn.com/) |
Powered by Discuz! X3.2 |