当前位置:  开发笔记 > 编程语言 > 正文

bash if -a vs -e选项

如何解决《bashif-avs-e选项》经验,为你挑选了1个好方法。

Bash文档中的 about -a-eoptions 都说:

-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/Results存在并且是一个目录.这就是我得到的:

-e
-a
! -a

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

-e
-a

所以:

    -a-e选项有什么区别?

    -a在单支架内使用时为什么会产生奇怪的结果?

Johannes Sch.. 67

我研究过,这很毛茸茸:

-a不推荐使用,因此不再在联机帮助页中列出/usr/bin/test,但仍然在bash中.使用-e.对于单个'[',bash内置行为与bash内置行为相同test,其行为/usr/bin/[/usr/bin/test(和一个是另一个的符号链接)相同.注意效果-a取决于它的位置:如果它在开始时,则意味着file exists.如果它位于两个表达式的中间,则表示逻辑and.

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

因为[[,-a不再用作二进制文件and(&&在那里使用),因此它的唯一目的是检查那里的文件(虽然被弃用).所以,否定实际上是你所期望的.



1> Johannes Sch..:

我研究过,这很毛茸茸:

-a不推荐使用,因此不再在联机帮助页中列出/usr/bin/test,但仍然在bash中.使用-e.对于单个'[',bash内置行为与bash内置行为相同test,其行为/usr/bin/[/usr/bin/test(和一个是另一个的符号链接)相同.注意效果-a取决于它的位置:如果它在开始时,则意味着file exists.如果它位于两个表达式的中间,则表示逻辑and.

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

因为[[,-a不再用作二进制文件and(&&在那里使用),因此它的唯一目的是检查那里的文件(虽然被弃用).所以,否定实际上是你所期望的.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有