如果Bash中的语句创建了奇怪的0文件

lin*_*ndy 0 bash if-statement

当我运行以下命令时:

if [ $(vboxmanage list vms | grep -c "all-in-one-1.2.7-wizard") > 0 ]; then
    echo 'yes'
else 
    echo 'no'
fi
Run Code Online (Sandbox Code Playgroud)

0在当前目录中创建一个文件:

$ ll
...
-rw-rw-r--  1 abc abc     0 Nov 19 17:33 0
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

fed*_*qui 6

您没有进行整数比较,而是将命令的输出重定向$()0,因此0创建了一个带有名称的文件.

此外,if条件的当前"分辨率"基于条件的执行结果.如果成功,则执行条件.

相反,使用-gt(greater than):

if [ $(vboxmanage list vms | grep -c "all-in-one-1.2.7-wizard") -gt 0 ]; then
                                                                 ^^
    echo 'yes'
else
    echo 'no'
fi
Run Code Online (Sandbox Code Playgroud)

您可以通过执行>7或任何操作确保这是行为,并查看创建的文件7(或其他).

else条件何时执行?如果您无法重定向:

$ [ $(ls /root) > 3 ] && echo "yes" || echo "no"
ls: cannot open directory /root: Permission denied
no
Run Code Online (Sandbox Code Playgroud)

有关所有可能的整数比较的列表,请参见数字比较.

  • 或者只是使用`grep -q` (3认同)