新技术论坛
搜索
查看: 644|回复: 0
打印 上一主题 下一主题

shell教程之五 返回值

[复制链接]
  • TA的每日心情

    2016-7-1 19:50
  • 签到天数: 81 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2016-3-13 15:03:13 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

    [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的返回值来:
    • 设置一个表示 nocasematch选项的当前状态的局部变量。
    • 设置该选项。
    • 返回 case命令。
    • 将 nocasematch选项重设为它的原始值。

    清单 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命令。



    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2024-12-23 18:55 , Processed in 0.148689 second(s), 22 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表