开发者俱乐部

标题: 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
  1. ian@attic-u15:~$ # nocasematch starts out unset
  2. ian@attic-u15:~$ shopt -p nocasematch ; echo $?
  3. shopt -u nocasematch
  4. 1
  5. ian@attic-u15:~$ # test it
  6. ian@attic-u15:~$ [[ "abc" = "ABC" ]] ;echo $?
  7. 1
  8. ian@attic-u15:~$ # set nocasematch
  9. ian@attic-u15:~$ shopt -s nocasematch ; echo $?
  10. 0
  11. ian@attic-u15:~$ # test the pattern again
  12. ian@attic-u15:~$ [[ "abc" = "ABC" ]] ;echo $?
  13. 0
  14. ian@attic-u15:~$ # restore nocasematch
  15. ian@attic-u15:~$ shopt -u nocasematch ; echo $?
  16. 0
复制代码

[size=1.166em]如 清单 19所示,修改后的 myorder函数现在可以使用来自 shopt的返回值来:
清单 19. 测试来自 shopt命令的返回值
  1. ian@attic-u15:~$ type myorder
  2. myorder is a function
  3. myorder ()
  4. {
  5.     local restorecase;
  6.     if shopt -q nocasematch; then
  7.         restorecase="-s";
  8.     else
  9.         restorecase="-u";
  10.         shopt -s nocasematch;
  11.     fi;
  12.     case "$*" in
  13.         "coffee" | "decaf")
  14.             echo "Hot coffee coming right up"
  15.         ;;
  16.         "tea")
  17.             echo "Hot tea on its way"
  18.         ;;
  19.         "soda")
  20.             echo "Your ice-cold soda will be ready in a moment"
  21.         ;;
  22.         *)
  23.             echo "Sorry, we don't serve that here"
  24.         ;;
  25.     esac;
  26.     shopt $restorecase nocasematch
  27. }
  28. ian@attic-u15:~$ shopt -p nocasematch
  29. shopt -u nocasematch
  30. ian@attic-u15:~$ # nocasematch is currently unset
  31. ian@attic-u15:~$ myorder DECAF
  32. Hot coffee coming right up
  33. ian@attic-u15:~$ myorder Soda
  34. Your ice-cold soda will be ready in a moment
  35. ian@attic-u15:~$ shopt -p nocasematch
  36. shopt -u nocasematch
  37. ian@attic-u15:~$ # nocasematch is unset again after running the myorder function
复制代码

[size=1.166em]如果您想您的函数(脚本)返回其他函数或命令可以测试的值,那么可以在您的函数中使用 return 语句。 清单 20展示了如何为一种您可以销售的饮品返回 0,如果客户请求其他商品,则返回 1。
清单 20. 设置您自己的函数返回值
  1. ian@attic-u15:~$ type myorder
  2. myorder is a function
  3. myorder ()
  4. {
  5.     local restorecase;
  6.     rc=0;
  7.     if shopt -q nocasematch; then
  8.         restorecase="-s";
  9.     else
  10.         restorecase="-u";
  11.         shopt -s nocasematch;
  12.     fi;
  13.     case "$*" in
  14.         "coffee" | "decaf")
  15.             echo "Hot coffee coming right up"
  16.         ;;
  17.         "tea")
  18.             echo "Hot tea on its way"
  19.         ;;
  20.         "soda")
  21.             echo "Your ice-cold soda will be ready in a moment"
  22.         ;;
  23.         *)
  24.             echo "Sorry, we don't serve that here";
  25.             rc=1
  26.         ;;
  27.     esac;
  28.     shopt $restorecase nocasematch;
  29.     return $rc
  30. }
  31. ian@attic-u15:~$ myorder coffee;echo $?
  32. Hot coffee coming right up
  33. 0
  34. ian@attic-u15:~$ myorder milk;echo $?
  35. Sorry, we don't serve that here
  36. 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