`
zhuyuyuseu
  • 浏览: 9330 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

傻瓜学Bash - Test及相关的比较操作

阅读更多

  

   一个if/then 结构可以测试命令的返回值是否为0(因为0 表示成功),如果是的话,执行更多命令.

有一个专用命令"["(左中括号,特殊字符).这个命令与test 命令等价,但是出于效率上的考虑,

它是一个内建命令.这个命令把它的参数作为比较表达式或是文件测试,并且根据比较的结果,

返回一个退出码.  

  ((...))和let...结果也能够返回一个退出码,当它们所测试的算术表达式的结果为非0 的时候,

他们的退出码将返回0.

  例如: 

  let "1<2" returns 0 (as "1<2" expands to "1")

  if 命令可以测试任何命令,不仅仅是括号中的条件. 例如:

  word=Linux

  letter_sequence=inu

  if echo "$word" | grep -q "$letter_sequence"

   # "-q"选项是用来阻止输出

     then

     echo "$letter_sequence found in $word"

     else

     echo "$letter_sequence not found in $word"

  fi

  当然,if/else 可以嵌套。除了上述的测试结构,[[]]结构比Bash 的[]更加灵活,使用[[]],而不是[],能够阻止脚本中的许多逻辑错误.

  以下是一些常用的测试操作(from ABS Guide):

     -e 文件存在

     -a 文件存在  这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用

     -f file 是一个regular 文件(不是目录或者设备文件)

     -s 文件长度不为0

     -d 文件是个目录

     -b 文件是个块设备(软盘,cdrom 等等)

     -c 文件是个字符设备(键盘,modem,声卡等等)

     -p 文件是个管道

     -h 文件是个符号链接

     -L 文件是个符号链接

     -S 文件是个socket

     -t 关联到一个终端设备的文件描述符,这个选项一般都用来检测是否在一个给定脚本中的 stdin[-t0]或[-t1]是一个终端

     -r 文件具有读权限(对于用户运行这个test)

     -w 文件具有写权限(对于用户运行这个test)

     -x 文件具有执行权限(对于用户运行这个test

     -g set-group-id(sgid)标志到文件或目录上,如果一个目录具有 sgid 标志,那么一个被创建在这个目录里的文件,这个目录属于创建,这个目录的用户组,并不一定与创建这个文件的用户的组相同.对于workgroup 的目录

共享来说,这非常有用.见<<UNIX 环境高级编程中文版>>第58 页.

     -u set-user-id(suid)标志到文件上,如果运行一个具有 root 权限的文件,那么运行进程将取得root 权限,即使你是一个普通,用户.[1]这对于需要存取系统硬件的执行操作(比如pppd 和cdrecord)非常有用.如果,没有 suid 标志的话,那么普通用户(没有root 权限)将无法运行这种程序.见<<UNIX 环境高级编程中文版>>第58 页.

                -rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppd

                 对于设置了 suid 的文件,在它的权限标志中有"s".

     -O 你是文件的所有者.

     -G 文件的group-id 和你的相同.

     -N 从文件最后被阅读到现在,是否被修改.

     f1 -nt f2   文件 f1 比f2 新

     f1 -ot f2   f1比f2 老

     f1 -ef f2    f1和f2 都硬连接到同一个文件.

     ! 非--反转上边测试的结果(如果条件缺席,将返回true)

      

  整数比较

      -eq 等于,如:if [ "$a" -eq "$b" ]

      -ne 不等于,如:if [ "$a" -ne "$b" ]

      -gt 大于,如:if [ "$a" -gt "$b" ]

      -ge 大于等于,如:if [ "$a" -ge "$b" ]

      -lt 小于,如:if [ "$a" -lt "$b" ]

      -le 小于等于,如:if [ "$a" -le "$b" ]

      < 小于(需要双括号),如:(("$a" < "$b"))

      <= 小于等于(需要双括号),如:(("$a" <= "$b"))

      > 大于(需要双括号),如:(("$a" > "$b"))

      >= 大于等于(需要双括号),如:(("$a" >= "$b"))

 

   字符串比较

      = 等于,如:if [ "$a" = "$b" ]

      == 等于,如:if [ "$a" == "$b" ],与=等价,注意:==的功能在[[]]和[]中的行为是不同的,如下:

                     [[ $a == z* ]] # 如果$a 以"z"开头(模式匹配)那么将为true

                     [[ $a == "z*" ]] # 如果$a 等于z*(字符匹配),那么结果为true

                     [ $a == z* ] # File globbing 和word splitting 将会发生

                     [ "$a" == "z*" ] # 如果$a 等于z*(字符匹配),那么结果为true

         一点解释,关于File globbing 是一种关于文件的速记法,比如"*.c"就是,再如~也是.

         但是 file globbing 并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

     != 不等于,如:if [ "$a" != "$b" ], 这个操作符将在[[]]结构中使用模式匹配.

     < 小于,在ASCII 字母顺序下.如:

                   if [[ "$a" < "$b" ]]

                   if [ "$a" \< "$b" ]

          注意:在[]结构中"<"需要被转义.

     > 大于,在ASCII 字母顺序下.如:

                   if [[ "$a" > "$b" ]]

                    if [ "$a" \> "$b" ]

            注意:在[]结构中">"需要被转义.

      -z 字符串为"null".就是长度为0.

     -n 字符串不为"null", 注意:

         使用-n 在[]结构中测试必须要用""把变量引起来.

 

 

 

分享到:
评论

相关推荐

    解决ssh远程登陆linux显示-bash-4.1$的问题

    cp -pr /etc/skel/.bash* /home/test/ #/home/test是用户目录 改变用户家目录:usermod -md /tmptest test 以上就是小编为大家带来的解决ssh远程登陆linux显示-bash-4.1$的问题全部内容了,希望大家多多支持软件开发...

    bash-4.4版本升级手册带安装包

    总之,升级Bash是一个涉及系统安全的重要操作,需要谨慎进行。遵循正确的升级流程,并充分利用提供的安装包和升级手册,可以确保过程顺利,降低风险。在升级过程中,始终记住备份和测试是保障系统安全的关键步骤。

    修复bash漏洞的bash-4.4.tar.gz源码包

    linux 服务器GNU Bash小于版本4.3有操作系统命令注入漏洞,需要对bash升级,下载解压 #tar zxvf bash-4.4.tar.gz #cd bash-4.4 #./configure (如果centos7编译失败,请先安装#yum install gcc) #make #make ...

    bash-completion-2.1-6.el7.noarch.rpm

    在centos6或rhel6 操作系统安装bash-completion-2.1-6.el7.noarch.rpm后,重启即生效

    bash-3.1-MSYS-1.0.11-snapshot.tar

    bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 ffmpeg 安装用包!

    bash-completion-2.1-6.el7.noarch.rar

    标题中的“bash-completion-2.1-6.el7.noarch.rar”指的是一个用于Linux系统的命令行自动补全工具bash-completion的版本2.1,适用于CentOS 6和7,以及RHEL 6和7的环境。这个压缩包是以RAR格式封装的“bash-...

    bash-door分析

    - **bash()函数**:用于下载bash的源代码,并对其执行补丁操作,最终编译并安装修改后的bash。 - **secshell()函数**:负责编译SeCshell.c并将其放置在/tmp目录下。 - **menu()函数**:提供了一个简单的菜单...

    bash-completion-1.3-7.el6.noarch.rpm

    centos6的yum源里面没有bash-completion的包,需要单独下载安装。...1、rpm -ivh bash-completion-1.3-7.el6.noarch.rpm (如有依赖报错,请按照提示安装相关依赖) 2、退出当前命令行,重新连接,即可使用bash命令补全

    bash-4.1.2-15

    标签 "bash" 明确地指出了讨论的主题,即与 Bash shell 相关的知识。 在提供的压缩包子文件名称列表中,我们可以看到以下三个文件: 1. bash-doc-4.1.2-15.el6_5.2.x86_64.rpm:这是一个文档包,包含了 Bash shell ...

    bash-4.0 源码

    bash-4.0源码是Linux操作系统中广泛使用的Bash Shell的第四次主要版本的原始代码。Bash,全称为Bourne-Again SHell,是GNU项目的一部分,由自由软件基金会的Chet Ramey维护。它是Unix和类Unix系统中的默认Shell,...

    bash-completion-2.1-8.el7.noarch (1).rpm

    离线安装包,测试可用

    bash-4.1.2-15.el6_5.2.x86_64.rpm

    执行如下命令查看设备是否存在bash安全漏洞。 #env -i X='() { (a)=&gt;\\' bash -c '/dev/stdout echo vulnerable' 2&gt;/dev/null 判定依据 如果以上命令的输出为以下内容则不合规: vulnerable

    Advanced Bash-Scripting Guide

    Advanced Bash-Scripting Guide

    bash-4.1.2-15.el6_5.1.x86_64.rpm

    修复redhat6 bash远程执行任意代码漏洞CVE-2014-6271

    bash-3.2-33.el5.1.x86_64.rpm

    修复bash远程执行漏洞,支持redhat linux 64位操作系统 CVE-2014-6271

    bash-debuginfo-3.2-33.el5_11.4.x86_64

    Bash-debuginfo包是Bash的主要软件包的补充,它包含了一些特殊的符号和元数据,这些信息对于开发人员和系统管理员来说非常有用,当他们需要诊断或调试与Bash相关的错误和问题时。 具体来说,调试信息包括了源代码...

    bash-4.2.46-35.el7_9.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    bash-4.1.2-9.el6_2.i686.rpm

    bash-4.1.2-9.el6_2.i686.rpm是centos工具类。

    bash-3.2-33.el5_11.4.x86_64

    标题中的“bash-3.2-33.el5_11.4.x86_64”指的是Linux系统中Bash shell的一个特定版本。Bash是GNU项目的一部分,是Linux和Unix系统上广泛使用的命令解释器,即我们常说的Shell。这里的版本号3.2表明这是Bash 3.2系列...

    出现bash-2.05b的解决办法

    出现bash-2.05b的解决办法,出现bash-2.05b的解决办法

Global site tag (gtag.js) - Google Analytics