软件测试


网站首页 | 软件测试论坛 | 软件测试培训 | 软件测试博客 | 软件测试杂志 | 软件测试沙龙 | 软件测试下载 | 软件测试顾问
业界新闻 | 软件测试人才 | 软件测试技术 | 软件测试工具 | 行业软件测试 | 软件测试管理 | 软件质量专栏 | 软件开发专栏
当前位置:首页>>软件开发专栏>>操作系统>>正文
Linux 技巧: Bash 测试和比较函数(三)
文章出处:developerWorks 作者:Ian Shields 发布时间:2007-03-21

条件测试

    虽然使用以上的测试和 &&|| 控制操作符能实现许多编程,但 bash 还包含了更熟悉的 “if, then, else” 和 case 结构。学习完这些之后,将学习循环结构,这样您的工具箱将真正得到扩展。

If、then、else 语句

    bash 的 if 命令是个复合命令,它测试一个测试或命令($?)的返回值,并根据返回值为 True(0)或 False(不为 0)进行分支。虽然上面的测试只返回 0 或 1 值,但命令可能返回其他值。请参阅 LPI exam 102 prep: Shells, scripting, programming, and compiling 教程学习这方面的更多内容。

    Bash 中的 if 命令有一个 then 子句,子句中包含测试或命令返回 0 时要执行的命令列表,可以有一个或多个可选的 elif 子句,每个子句可执行附加的测试和一个 then 子句,子句中又带有相关的命令列表,最后是可选的 else 子句及命令列表,在前面的测试或 elif 子句中的所有测试都不为真的时候执行,最后使用 fi 标记表示该结构结束。

    使用迄今为止学到的东西,现在能够构建简单的计算器来计算算术表达式,如清单 9 所示:


清单 9. 用 if、then、else 计算表达式
[ian@pinguino ~]$ function mycalc ()
> {
>   local x
>   if [ $# -lt 1 ]; then
>     echo "This function evaluates arithmetic for you if you give it some"
>   elif (( $* )); then
>     let x="$*"
>     echo "$* = $x"
>   else
>     echo "$* = 0 or is not an arithmetic expression"
>   fi
> }
[ian@pinguino ~]$ mycalc 3 + 4
3 + 4 = 7
[ian@pinguino ~]$ mycalc 3 + 4**3
3 + 4**3 = 67
[ian@pinguino ~]$ mycalc 3 + (4**3 /2)
-bash: syntax error near unexpected token `('
[ian@pinguino ~]$ mycalc 3 + "(4**3 /2)"
3 + (4**3 /2) = 35
[ian@pinguino ~]$ mycalc xyz
xyz = 0 or is not an arithmetic expression
[ian@pinguino ~]$ mycalc xyz + 3 + "(4**3 /2)" + abc
xyz + 3 + (4**3 /2) + abc = 35
        

    这个计算器利用 local 语句将 x 声明为局部变量,只能在 mycalc 函数的范围内使用。let 函数具有几个可用的选项,可以执行与它密切关联的 declare 函数。请参考 bash 手册或使用 help let 获得更多信息。

    如清单 9 所示,需要确保在表达式使用 shell 元字符 —— 例如(、)、*、> 和 < 时 —— 正确地对表达式转义。无论如何,现在有了一个非常方便的小计算器,可以像 shell 那样进行算术计算。

    在清单 9 中可能注意到 else 子句和最后的两个示例。可以看到,把 xyz 传递给 mycalc 并没有错误,但计算结果为 0。这个函数还不够灵巧,不能区分最后使用的示例中的字符值,所以不能警告用户。可以使用字符串模式匹配测试(例如
[[ ! ("$*" == *[a-zA-Z]* ]]
,或使用适合自己范围的形式)消除包含字母表字符的表达式,但是这会妨碍在输入中使用 16 进制标记,因为使用 16 进制标记时可能要用 0x0f 表示 15。实际上,shell 允许的基数最高为 64(使用 base#value 标记),所以可以在输入中加入 _ 和 @ 合法地使用任何字母表字符。8 进制和 16 进制使用常用的标记方式,开头为 0 表示八进制,开头为 0x 或 0X 表示 16 进制。清单 10 显示了一些示例。


清单 10. 用不同的基数进行计算
[ian@pinguino ~]$ mycalc 015
015 = 13
[ian@pinguino ~]$ mycalc 0xff
0xff = 255
[ian@pinguino ~]$ mycalc 29#37
29#37 = 94
[ian@pinguino ~]$ mycalc 64#1az
64#1az = 4771
[ian@pinguino ~]$ mycalc 64#1azA
64#1azA = 305380
[ian@pinguino ~]$ mycalc 64#1azA_@
64#1azA_@ = 1250840574
[ian@pinguino ~]$ mycalc 64#1az*64**3 + 64#A_@
64#1az*64**3 + 64#A_@ = 1250840574

对输入进行的额外处理超出了本技巧的范围,所以请小心使用这个计算器。

elif 语句非常方便。它允许简化缩进,从而有助于脚本编写。在清单 11 中可能会对 type 命令在 mycalc 函数中的输出感到惊讶。


清单 11. Type mycalc
[ian@pinguino ~]$ type mycalc
mycalc is a function
mycalc ()
{
    local x;
    if [ $# -lt 1 ]; then
        echo "This function evaluates arithmetic for you if you give it some";
    else
        if (( $* )); then
            let x="$*";
            echo "$* = $x";
        else
            echo "$* = 0 or is not an arithmetic expression";
        fi;
    fi
}
 

    当然,也可以只用 $(( 表达式 ))echo 命令进行 shell 算术运算,如清单 12 所示。这样就不必学习关于函数或测试的任何内容,但是请注意 shell 不会解释元字符,例如 *,因此元字符不能在 (( 表达式 ))[[ 表达式 ]] 中那样正常发挥作用。


清单 12. 在 shell 中用 echo 和 $(( )) 直接进行计算
[ian@pinguino ~]$  echo $((3 + (4**3 /2)))
35

上一页


站内搜索
相关文章
◎Linux 技巧: Bash 测试和比较函数(二)
◎Linux 技巧: Bash 测试和比较函数(一)
◎Apache Server 负载能力测试
◎Web服务器和应用程序服务器的区别
◎Linux中通过缓存DNS的解析来提高上网的响应速度
◎Windows上启动linux图形终端的方法
◎Windows下通过xmanager远程桌面控制Linux
◎Linux操作系统下6个应急处理小常识
◎实现samba可写不可删除
◎Linux学习 系统FAQ
◎linux资源管理(2)
◎linux资源管理(1)
◎linux命令全记录
◎Linux解释器原理
◎自动安装Windows
◎Unix系统安全必读(2)
◎Unix系统安全必读(1)
◎GCC 命令行详解
◎linux shell 脚本入门
◎Linux网络安全之经验谈(2)
◎如何在Linux下搭建Web应用环境
◎Linux网络安全之经验谈(1)
◎linux下的网络分析Tcpdump命令的使用
◎linux下网络经典问题指南篇
◎资深Linux程序员的开发经验谈
◎Linux操作系统12则经典应用技巧
◎Linux上的C/C++编译器gcc/egcs详解
◎Linux无线网络技术概述:WLAN
◎Unix系统安全必读
◎Linux内核模块和驱动的编写
◎Linux 下 C++程序的异常处理技巧
◎如何在Linux环境模拟DOS命令
◎Linux的常用网络命令
◎操作系统探测
◎实时操作系统VxWorks在跟踪雷达系统中的应用
◎Linux嵌入式系统开发平台选型探讨
◎uCOS和uClinux的比较
◎XP自带网络诊断程序解决网络故障
◎完全掌握Windows系统还原12招
◎Linux 下 C++程序的异常处理技巧
◎巧用DLL文件来隐藏你的资料
◎使用 Bash shell 脚本进行功能测试
◎学会使用Linux性能分析工具
◎Qmail安装及设定
◎Microsoft 群集服务 (MSCS) 简介
◎Linux初学之学习方向和方法浅谈
◎Linux常见紧急情况处理方法
◎Linux操作系统中的7件武器详解
◎Windows XP鲜为人知的N招
◎嵌入式系统Boot Loader 技术内幕(4)
热门文章
◎Sun Solaris指令大全
◎vi使用手册
◎linux shell 脚本入门
◎学会使用Linux性能分析工具
◎Linux指令大全(1)
◎嵌入式系统Boot Loader技术内幕(2)
◎Linux操作系统12则经典应用技巧
◎Linux的常用网络命令
◎Linux上的C/C++编译器gcc/egcs详解
◎Windows XP鲜为人知的N招
◎GCC 命令行详解
◎Linux下硬盘分区详解
◎嵌入式系统Boot Loader 技术内幕(1)
◎linux指令大全(2)
◎Qmail安装及设定
◎Linux嵌入式系统开发平台选型探讨
◎uCOS和uClinux的比较
◎嵌入式系统Boot Loader技术内幕(3)
◎linux指令大全(3)
◎Linux内核模块和驱动的编写
◎linux指令大全(4)
◎linux命令全记录
◎使用 Bash shell 脚本进行功能测试
◎linux下网络经典问题指南篇
◎linux使用大全(5)
◎Linux初学之学习方向和方法浅谈
◎嵌入式系统Boot Loader 技术内幕(4)
◎linux使用大全(9)
◎linux使用大全(6)
◎linux使用大全(7)
◎巧用DLL文件来隐藏你的资料
◎Linux解释器原理
◎安全高效 方便简洁—《Sun Solaris 10》测试手记
◎linux使用大全(8)
◎如何在Linux下搭建Web应用环境
◎Linux无线网络技术概述:WLAN
◎Linux操作系统中的7件武器详解
◎XP自带网络诊断程序解决网络故障
◎实时操作系统VxWorks在跟踪雷达系统中的应用
◎完全掌握Windows系统还原12招
◎自动安装Windows
◎Linux常见紧急情况处理方法
◎资深Linux程序员的开发经验谈
◎操作系统探测
◎如何在Linux环境模拟DOS命令
◎Unix系统安全必读
◎linux下的网络分析Tcpdump命令的使用
◎Unix系统安全必读(1)
◎Linux 下 C++程序的异常处理技巧
◎linux资源管理(1)

Google提供的广告