bash如果

有关Bash文档(http://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions)中的“-a”和“-e”选项的说法如下:

-a file
    True if file exists.
-e file
    True if file exists. 

试图得到什么区别是我运行以下脚本:

resin_dir=/Test/Resin_wheleph/Results

if [ -e ${resin_dir} ] ; then
    echo "-e ";
fi

if [ ! -e ${resin_dir} ] ; then
    echo "! -e";
fi

if [ -a ${resin_dir} ] ; then
    echo "-a";
fi

if [ ! -a ${resin_dir} ] ; then
    echo "! -a";
fi

/ Test / Resin_wheleph /结果存在,并且是一个目录。 这就是我得到的:

-e
-a
! -a

这似乎有点奇怪(注意“-a”和“!-a”)。 但是当我使用双括号(例如, if [[ -e ${resin_dir} ]] )在类似的脚本中给出合理的输出:

-e
-a

所以:

  • “-a”和“-e”选项有什么区别?
  • 为什么“-a”在单个括号内使用时会产生一个奇怪的结果?

  • 我研究过,这很毛茸茸的:

    -a已弃用,因此未在/usr/bin/test的联机帮助页面中列出,但仍位于bash中。 使用-e 。 对于单个'[',bash内建行为与test bash内建行为相同,后者的行为与/usr/bin/[/usr/bin/test (其中一个是另一个的符号连接)相同。 注意-a的作用取决于其位置:如果它在开始处,则表示file exists 。 如果它在两个表达式中间,则意味着逻辑and

    [ ! -a /path ] && echo exists [ ! -a /path ] && echo exists不起作用,因为bash手册指出-a在那里被认为是一个二元运算符,所以上面不会被解析为negate -a ..而是作为if '!' and '/path' is true if '!' and '/path' is true (非空)。 因此,你的脚本总是输出"-a" (实际上是测试文件),而"! -a"实际上是一个二进制文件and在这里。

    对于[[-a不作为二进制and了( &&使用有),所以其独特的目的是检查的文件存在(虽然被否决)。 所以,否定实际上符合你的期望。


    测试操作符的' -a '选项具有一个作为一元操作符的含义和另一个作为二元操作符的含义。 作为二元运算符,它是'和'连接词(而' -o '是'或'连接词)。 作为一个一元运算符,它显然会测试一个文件的存在。

    autoconf系统建议您避免使用' -a ',因为这会导致混淆; 现在我明白了为什么。 事实上,在便携式shell编程中,最好将条件与' && '或' ||结合起来 ”。

    我认为@litb是正确的。 当你有' ! -a ${resin_dir} ! -a ${resin_dir} ',Bash可能会将其解释为“是字符串”! 非空,并且是'$ {resin_dir}'非空的字符串,答案是肯定的.Korn shell有不同的视图,而Bourne shell又是另一个视图 - 所以远离' -a ”。

    在Solaris 10上:

    $ bash -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
    Bad
    $ ksh -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
    OK
    $ sh -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
    sh: test: argument expected
    $
    

    双括号[[exp]]是bash内建的。 在bash中-a和-e是相同的,可能是为了一些向后兼容性。

    单个括号[exp]是外部命令“test”的别名。 在“测试”中,-a是一个逻辑与。 尽管[Nothing AND $ STRING]看起来应该是错误的,但test有一些语法怪癖,这就是为什么我建议使用bash内建函数[[exp]],它更趋于理智。

    注意:当你使用“[”时,bash确实会调用/ bin / [。

    $ [ $UNASIGNED_VAR == "bar" ]
    bash: [: ==: unary operator expected
    

    该错误显示名为[的bash。 strace还显示“execve(”/ usr / bin / [“,...”

    链接地址: http://www.djcxy.com/p/24133.html

    上一篇: bash if

    下一篇: Test multiple file conditions in one swoop (BASH)?