`
uptake
  • 浏览: 21052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shell test与let

阅读更多

shell test与let

单 方括号的test命令通常用内置的test命令来测试表达式值,test命令也被链接到方括号上。这样,既可以使用单独的test命令,也可以通过把 表达式用单方括号括起来,来测试表达式的值。在用test命令或方括号测试表达式时,表达式中的shell元字符不会被扩展。由于要对变量进行单词分离, 因此包含空白符的字符串必须用引号括起来
双 方括号的test命令2.x版bash中,用双方括号[[  ]](内置的test复合命令)来测试表达式的值,其中,对变量不进行单词分离,但可以通过元字符扩展进行模式匹配。包含空白符的字符串必须用引号括起 来。如果一个字符串(不管含不含空白符)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。逻辑操作 符&&(与)和| | (或)代替了与test命令一起使用的-a和-o选项

(test 命令 )
( 命令行 )
1   $ name=Tom
2   $ grep "$name" /etc/passwd
3   $ echo $?
4   $ test $name != Tom
5   $ echo $?
    1              # Failure
6   $ [ $name = Tom ]   # Brackets replace the test command
7   $ echo $?
    0
8   $ [ $name = [Tt]?? ]
    $ echo $?
     1
9   $ x=5
    $ y=20
10   $ [ $x -gt $y ]
    $ echo $?
    1
11  $ [ $x -le $y ]
    $ echo $?
    0
说明
1. 变量 name 被赋值为字符串 Tom
2. grep 命令在文件 passwd 中查找字符串 Tom
3. 变量 包含 shell 执行的上一条命令的退出状态,本例中是 grep 命令的退出状态。如果 grep 成功地找到了字符串 Tom ,就返回退出状态 0 。这条 grep 命令执行成功。
4. test 命令可用于测试字符串和数字,也可用来执行文件测试。和所有的命令一样, test 也会返回一个退出状态:退出状态为 0 ,则表达式为真,退出状态为 1 ,则表达式为假。表达式的等号两侧必须有空格。这条命令测试 name 的值是否等于 Tom
5. 测试失败, test 返回的退出状态为 1
6. 方括号是 test 命令的另一种表示方式。第一个方括号后面必须跟空格。这里的表达式测试变量 name 的值是否为字符串 Tom Bash 中既可以使用单等号来测试字符串是否相等,也可以使用双等号来进行测试。
7. test 的返回值是 0 。因为变量 name 的值等于 Tom ,所以 test 执行成功。
8. test 命令不允许通配符展开。由于问号被当作一个普通字符,因此 test 执行失败, Tom [Tt]?? 不相等。返回状态为 1 ,表示该表达式测试失败。
9. x y 赋数值。
10. test 命令使用数值关系操作符进行测试。本例中, test 命令检测 $x 是否大于 $y ,如果是则返回 0 ,否则,返回 1( 见表 14-3)
11. test 命令检测 $x 是否小于或等于 $y ,如果是则返回 0 ,否则,返回 1
14-3 test 命令操作符
   
字符串测试
[ string1 = string2 ]
string1 等于 string2(= 两侧必须有空格 )
[ string1= = string2 ]
string1 等于 string2( 2.x bash 中可以用单等号 = 代替 )
[ string1 != string2 ]
string1 不等于 string2(!= 两侧必须有空格 )
[ string ]
string 不为空
[ -z string ]
string 的长度为 0
[ -n string ]
string 的长度不为 0
[ -l string ]
string 的长度 ( 字符数 )
例如:          test –n $word   [ -n $word ]
           test tom = sue  [ tom = sun ]
逻辑测试
[ string1 –a string2 ]
string1 string2 都为真
[ string1 –o string2 ]
string1 string2 至少有一个为真
[ !string1 ]
字符串不匹配
逻辑测试 ( 复合命令 )
[[ pattern1 && pattern2 ]]
pattern1 pattern2 都为真
[[ pattern1 || pattern2 ]]
pattern1 pattern2 至少有一个为真
[[ !pattern1 ]]
模式不匹配
整数测试
[ int1 –eq int2 ]
int1 等于 int2
[ int1 –ne int2 ]
int1 不等于 int2
[ int1 –gt int2 ]
int1 大于 int2
[ int1 –ge int2 ]
int1 大于或等于 int2
[ int1 –lt int2 ]
int1 小于 int2
[ int1 –le int2 ]
int1 小于或等于 int2
用于文件测试的二进制操作符
[ file1 –nt file2 ]
如果文件 file1 file2 新则为真 ( 根据修改时间 )
[ file1 –ot file2 ]
如果文件 file1 file2 老则为真
[ file1 –ef file2 ]
如果文件 file1 file2 有相同的设备数或 i 结点数则为真
范例 14-17
( 复合的 test 命令 )(bash2.x)
   $ name=Tom; friend=Joseph
1   $ [[ $name == [Tt]om ]]      # Wildcards allowed
    $ echo $?
    0
2   $ [[ $name == [Tt]om && $friend == "Jose" ]]
    $ echo $?
    1
3   $ shopt -s extglob           # Turns on extended pattern matching
4   $ name=Tommy
5   $ [[ $name == [Tt]o+(m)y ]]
    $ echo $?
    0
说明
1. 如果使用复合的 test 命令,在字符串测试中可以使用 shell 元字符。本例中的表达式将进行字符串相等测试,看变量 name 是否匹配于 Tom tom tommy 等。表达式为真,则退出状态 (?) 0
2. 逻辑操作符 &&( ) | | ( ) 可以与复合的 test 命令一起使用。如果是 && 操作,两边的表达式必须都为真,如果第一个表达式测试为假,则不再进行进一步测试。而对于 | | 逻辑操作符,两个表达式中有一个为真即可,如果第一个表达式测试为真,则不再进行进一步测试。注意: “Jose” 是被引号括起来的,如果不使用引号,则是测试变量 friend 是否包含模式 Jose Jose Joseph 都满足条件。这里第二个条件非真,表达式测试为假,退出状态为 1
3. 用内置的 shopt 命令打开扩展的模式匹配开关。
4. 变量 name 被赋值为 Tommy
5. 测试表达式是否相等,包含模式匹配元字符。测试变量 name 是否匹配于一个字符串:它以字母 T t 开头、后跟字母 o 、接着是一个或多个字母 m ,最后跟字母 y
后面的范例将说明如何使用内置的test命令、带单方括号的test命令,以及带双方括号的复合命令来测试退出状态。
let 命令和带双圆括号的算术运算 虽然test命令可以计算算术表达式的值,但读者可能更愿意使用let命令,因为let命令带有丰富的类C操作符(bash 2.x)。let命令可以将表达式包含在一组圆括号中来表达不同的含义。
不管使用的是test命令、复合命令还是let命令,表达式的结果都会被测试。返回零表示成功,而返回非零状态表示失败(参见表14-4)。
14-4  let 命令操作符
   
   
-
+
!
~
*
/
%
+
-
负号
正号
逻辑非
按位取反
乘法
除法
余数
加法
减法
                                     (续表)  
   
   
<< 
>> 
<= >= < >
== !=
&
^
|
&&
| |
= *= /= %= += -= <<= >>= &= ^= |=
按位左移
按位右移
关系运算符
相等、不相等
按位与操作
按位异或操作
按位或操作
逻辑与
逻辑或
赋值、快捷赋值运算符
范例14-18说明了let命令中如何使用双圆括号。
范例 14-18
(let 命令 )(bash2.x)
( 命令行 )
1   $ x=2
    $ y=3
2   (( x > 2 ))
    echo $?
    1
3   (( x < 2 ))
    echo $?
    0
4   (( x == 2 && y == 3 ))
    echo $?
    0
5   (( x > 2 || y < 3 ))
    echo $?
    1
说明
1. x y 赋值。
2. 双圆括号代替 let 命令来测试数值表达式。如果 x y 大,退出状态为 0 。由于条件不满足,因此退出状态为 1 。变量 ? 包含上一条执行命令的退出状态,这里是 (( )) 命令的退出状态。注意,括在 (( )) 中的变量不需要使用美元符 $
3. 用双圆括号测试表达式。如果 x 小于 2 ,则返回退出状态 0 ,否则,返回 1
4. 测试复合表达式:如果 x 等于 2 y 等于 3( 即两个表达式都为真 ) ,则退出状态返回 0 ,否则,返回 1
5. 测试复合表达式:如果 x 大于 2 y 小于 3( 即有一个表达式为真 ) ,则退出状态返回 0 ,否则,返回 1
分享到:
评论

相关推荐

    跟老男孩学Linux运维:Shell编程实战

    / 554.4 Shell特殊扩展变量的知识与实践 / 60第5章 变量的数值计算实践 / 655.1 算术运算符 / 655.2 双小括号“(())”数值运算命令 / 665.3 let运算命令的用法 / 735.4 expr命令的用法 / 755.5 bc命令的用法 ...

    shell::test_tube:Shell是用Swift编写的µ库,用于运行系统命令

    :test_tube: 贝壳Shell是一个由Swift编写的µ库,用于运行Shell任务。安装 :hammer_and_wrench:迅捷软件包管理器在您的Package.swift文件中添加依赖项: let package = Package ( name : " myproject " , ...

    Shell算术运算符_适合小白的学习笔记

    Shell算术运算符   1.算术符分类: 算数运算符:+、-、*、/、…. #乘法符号*有些情况下需要转义成*\ 增强型:+=、-=、*=、/=、%= 2.使用算数运算符: let varname=算数表达式 varname=$[算数表达式] varname=$(...

    api-test:使用 Jasmine 测试 API

    在单独的 shell 中运行测试 npm test 编写测试 测试是用 Jasmine 编写的,使用 es7 和 babel 作为预处理器。 检查src/test/hello.spec.js以获得灵感。 使用babel导入req和 polyfill import request from '../lib...

    scheme:给你写个计划

    $ ./run -s test/let.scheme # Run file $ ./run --help 构建参考实现。 $ stack exec scheme 测试参考实现。 (请参阅test-hs / Spec.hs) $ stack test 在GHCI中调试参考实现。 $ stack repl 为教程文本...

    Linux高级bash编程

    用"let"命令来作算术操作. 11-11. 显示eval命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本 11-14. 在Perl脚本中使用eval命令来强制变量替换 11-15. 使用set来改变脚本的位置参数 11-16. 重新分配...

    autodoc:从机架应用程序和请求规范生成文档

    # shell-command AUTODOC=1 rspec 例子 对于任何具有机架测试的机架应用 # spec/requests/entries_spec.rb describe "Entries" do include Rack :: Test :: Methods let ( :app ) do MyRackApplication end ...

    2009 达内Unix学习笔记

    各个 shell 可互相切换 ksh:$ sh:$ csh:guangzhou% bash:bash-3.00$ 一、注意事项 命令和参数之间必需用空格隔开,参数和参数之间也必需用空格隔开。 一行不能超过256个字符;大小写有区分。 二、特殊字符...

    Advanced Bash-Scripting Guide <>

    用"let"命令来作算术操作. 11-11. 显示eval 命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本 11-14. 在Perl 脚本中使用eval 命令来强制变量替换 11-15. 使用set 来改变脚本的位置参数 11-16. 重新...

    nginx-docker-letsencrypt:基本模板结合起来,让我们在Docker环境中使用Nginx进行加密

    此存储库旨在与使用docker-compose和nginx的项目一起使用。 检查80端口是否打开 在主机上启动测试环境 docker-compose up -f &lt;path&gt;/data/test-http/test.yml up 等到您在输出中看到类似以下内容的内容: ... /...

    install-script:为您的CLI生成安装脚本

    安装脚本 为npm上托管的CLI程序生成通用(OS X和Linux)安装脚本。特征安装git,curl和...let script = installScript ( { name : 'ava'} ) ;相关项目从CLI生成安装脚本测验 $ make test执照麻省理工学院:copyright:

    i-vector的工具箱

    String arguments, either for a file name or a numerical value, are useful when these tools are compiled and called from a shell command line. This makes it easy to use the tools on machines with ...

    VB编程资源大全(英文源码 控件)

    &lt;END&gt; 48,ShellLnk.zip ShellLink ActiveX Control 1.0 can retrives and save all the information from a shortcut file(.lnk extension) which can be accessed by using various properties and methods...

    VB编程资源大全(英文源码 API)

    drvtype.zip Determine Drive Type&lt;END&gt;&lt;br&gt;47,findcd1.zip Find the First CD-ROM&lt;END&gt;&lt;br&gt;48,xxsShell32.zip Shell32 functions and subs wrapper for VB developers.&lt;END&gt;&lt;br&gt;49,api2.zip This ...

    uhdd.sys源码

    no cache or diskettes can be used in test or diagnostic work and takes 3664 bytes of upper DOS memory If its N2 switch is given UIDE will omit all CD DVD logic saving 1744 bytes Its &quot;CD DVD&...

Global site tag (gtag.js) - Google Analytics