【问题标题】:Strangeness with bash not operatorbash not 运算符的奇怪之处
【发布时间】:2010-09-28 04:45:49
【问题描述】:

我正在尝试确定文件或目录是否不存在。我尝试了以下命令来查看文件是否存在并且它们是否正常工作:

if [ -a 'settings.py' ]; then echo 'exists'; fi
exists #output
if [ -a 'foo' ]; then echo 'exists'; fi #outputs nothing

但是当我尝试这个时:

if [ ! -a 'settings.py' ]; then echo 'does not exist'; fi
does not exist #shouldn't be output since the file does exist
if [ ! -a 'foo' ]; then echo 'does not exist'; fi
does not exist

无论如何都会输出'不存在'。

【问题讨论】:

    标签: bash file exists


    【解决方案1】:

    我之前遇到过[ 命令的问题。我更喜欢[[ 变体,因为它更强大,而且根据我的经验,不太容易出现这样的“陷阱”。

    如果您使用[[ 命令,您的测试命令可以正常工作:

    pax> touch qq
    pax> if [[ -a qq ]] ; then echo exists ; fi
    exists
    pax> if [[ ! -a qq ]] ; then echo not exists ; fi
    pax> rm qq
    pax> if [[ ! -a qq ]] ; then echo not exists ; fi
    not exists
    

    【讨论】:

    • 我完全不同意——[ 是可移植的,如果你知道它的所有怪癖的话; [[ 不能被依赖存在。
    • @Zack,这个问题被标记为bash。我知道其他外壳可能无法提供它。而且我敢肯定你可能不同意更多 - 你只需要更加努力:-)
    • 此外,对于[[,您可以使用&&||,而无需拆分括号中的表达式。 [[ foo && bar || baz ]] 而不是 [ foo ] && [ bar ] || [ baz ]
    • 我不相信编写特定于 bash 的 shell 脚本;如果你需要一些便携式 shell 没有的东西,那么是时候开发一种真正的脚本语言了......
    【解决方案2】:

    尝试使用-e 代替-a

    Linux Documentation Project 上的这个页面说:

    -a 在效果上与-e 相同。但它已被弃用,不鼓励使用。

    【讨论】:

    • 是的。进一步解释:-a 不是在[ 之后的第一件事时,它被解释为“和”而不是“存在测试”。 “不和”是没有意义的,你说?哎呀。这也是您永远不应在“和”/“或”含义中使用-a/-o 的众多原因之一;请改用[ ... ] && [ ... ] / [ ... ] || [ ... ]。你说烦人的冗长吗?哎呀。壳很烂,十一点拍。
    【解决方案3】:

    你可以使用test

    test -e "$file" && echo "exists"
    

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2012-02-29
      • 1970-01-01
      相关资源
      最近更新 更多