我想写一个shell脚本,检查某个文件,archived_sensor_data。Json,如果存在,删除它。在http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html网站上,我尝试了以下方法:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

但是,这会抛出一个错误

[-e: command not found

当我尝试使用。/test_controller命令运行生成的test_controller脚本时。代码出了什么问题?


当前回答

你也可以用stat:

stat /
  File: /
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 2           Links: 26
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-01-01 02:00:00.000000000 +0200
Modify: 2009-01-01 02:00:00.000000000 +0200
Change: 2009-01-01 02:00:00.000000000 +0200
 Birth: -

在一个不存在的路径上,你会得到:

stat /aaa
stat: cannot stat '/aaa': No such file or directory

其他回答

在内部,rm命令必须测试文件是否存在, 那么为什么要添加另一个测试呢?只是问题

rm filename

在那之后,它就会消失,不管它是否在那里。 如果你不想要任何关于不存在的文件的消息,使用rm -f。

如果您需要在文件不存在时采取一些操作,那么您必须自己进行测试。根据您的示例代码,在这个实例中不是这样的。

你也可以用stat:

stat /
  File: /
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 2           Links: 26
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-01-01 02:00:00.000000000 +0200
Modify: 2009-01-01 02:00:00.000000000 +0200
Change: 2009-01-01 02:00:00.000000000 +0200
 Birth: -

在一个不存在的路径上,你会得到:

stat /aaa
stat: cannot stat '/aaa': No such file or directory

如果你正在使用NFS,“test”是一个更好的解决方案,因为你可以为它添加一个超时,以防NFS宕机:

time timeout 3 test -f 
/nfs/my_nfs_is_currently_down
real    0m3.004s <<== timeout is taken into account
user    0m0.001s
sys     0m0.004s
echo $?
124   <= 124 means the timeout has been reached

一个"[-e my_file]"构造将被冻结,直到NFS再次起作用:

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi

<no answer from the system, my session is "frozen">

下面是一个使用ls的替代方法:

(ls x.txt && echo yes) || echo no

如果你想隐藏ls的任何输出,这样你只能看到yes或no,将stdout和stderr重定向到/dev/null:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no

括号和-e之间缺少必要的空格:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi