如何在Bash中反转条件

3

我想检查Android上是否存在一个目录。

在shell脚本中使用通配符检查文件是否存在的答案中,我得到了一个想法。所以我像下面这样使用ADB

if [ adb shell ls ${test_dir}  2> /dev/null ] ;
then
   echo "files exist"
else
   echo "files do not exist"

fi

我是一名新手Bash脚本编写者。我知道adb shell ls将返回所有文件名,但是2> /dev/null的含义是什么?
我只关心文件不存在这种情况。那么我该如何反转这个条件?

第二版本

if [ ! adb shell ls ${test_dir}  2> /dev/null ] ;
then
   echo "files exist"
else
   echo "files do not exist"

fi

添加 ! 对我无效。


将所有错误消息发送到 /dev/null(位桶) 使用 if [ ! .... ] 进行反转 - David C. Rankin
@DavidC.Rankin 非常感谢。您能回答这个问题吗? - CoXier
好的,我会写下来。 - David C. Rankin
不要在命令周围使用方括号;它们是用于测试表达式的。请参见我在这里的答案 - Gordon Davisson
规范的可能是 *如何否定进程的返回值?*? - Peter Mortensen
1个回答

1
在表达式中:

if [ adb shell ls ${test_dir}  2> /dev/null ]

重定向2> /dev/null会将stderr上的任何消息(由abd shell ls ${test_dir}引起的任何错误)重定向到/dev/null,俗称bit bucket。实际上,bit bucket是一个不通向任何地方的系统设备节点。因此,您可以将任何输出复制或重定向到/dev/null,它只是消失了(这意味着它不会被复制到任何地方,也不会被进一步重定向 - 它只是进入了bit bucket-一个黑洞,为了方便而设)。这会抑制测试本身的任何输出。
你的第二个问题问如何否定(反转)一个测试子句。简单的答案是在测试前面放置一个'!'
如果您有更多问题,请告诉我。

经过进一步讨论和梳理,确认adb是一个安卓工具后,解决方案就是简单地检查命令本身执行后的返回值,例如:

$ adb shell ls ${test_dir}  2> /dev/null

然后使用

测试返回值


if [ "$?" -ne '0' ]; then 
    # handle error
fi

如果您对此问题有进一步的疑问,请告诉我。

if [ ! adb shell ls ${test_dir} 2> /dev/null ] ?但是对我来说不起作用。 - CoXier
让我进一步查看您的链接。abd不是bash命令或测试。如果您要测试空目录,则需要使用以下内容:[ -z "$(ls -A "$test_dir")" ] 如果您想知道它是否有文件,则使用[ "$(ls -A "$test_dir" | wc -l)" -gt 0 ] - David C. Rankin
没关系,随着年龄的增长,我的眼睛也开始花了:)。你是在测试目录中的文件还是空目录? - David C. Rankin
我想检查目录是否存在。这是我的错,我会更新我的问题。 - CoXier
1
如果您想测试目录是否存在,请使用 if [ -d "$dirname" ]; then echo "$direname exists"; else echo "$dirname not found"; fi。您也可以只检查 if [ ! -d "$dirname" ]; then echo "$dirname doesn't exist"; fi - David C. Rankin
让我们在聊天中继续这个讨论 - CoXier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接