如果目录和文件存在,Bash脚本无法正确检查

时间:2017-02-09 14:42:53

标签: linux bash

由于某些原因,我的if condition文件和目录不存在未正确处理。该脚本认为文件和目录存在时不存在。

#!/usr/bin/bash
lockdir=/opt/someOtherDis/qa_test_lock
puppetlock=/var/opt/puppetLockDirs/agent_catalog_run.lock

if [ ! -f "$puppetlock" ] && [ ! -d "$lockdir"]; then
    #Get a url and grep it to get stuff
else
     su -c "echo ls puppetlock results: $(ls -lrt $puppetlock) and qa lock results: $(ls -lrt $lockdir) >> /var/log/dirStuff/test-qa-run.log" -m "someUser"
    su -c "echo $(date +\"%m-%d-%T\") Puppet or QA tests are running. Did not attempt to update artifact version. >> /var/log/dirStuff/test-qa-run.log" -m "someUser"
fi

我添加了ls的输出,以确保我能看到是否存在木偶或qa锁。

这是日志文件的输出,第一次检查是我手动运行puppet时所以我可以确保工作正常。

  

02-09-08:16:01正在运行Puppet或QA测试。没试过   更新工件版本。 ls puppetlock结果:-rw-r - r-- 1根root   2月9日08:27 /var/opt/lib/pe-puppet/state/agent_catalog_run.lock和   qa锁定结果:

     

02-09-08:28:01 Puppet或QA测试正在运行。难道   不要尝试更新工件版本。

     

08年2月9日:30:02   app_versions.json在过去30分钟内没有被修改过   puppetlock结果:和qa锁定结果:

     

02-09-08:30:02 Puppet或QA   测试正在运行。没有尝试更新工件版本。 LS   puppetlock结果:和qa锁定结果:

     

02-09-08:32:01 Puppet或QA   测试正在运行。没有尝试更新工件版本。

1 个答案:

答案 0 :(得分:1)

嗯,好像你打算写:

if [ ! -f "$puppetlock" ] || [ ! -d "$lockdir" ]; then

哪个(IMO)写得更清楚:

if ! test -f "$puppetlock" -a -d "$lockdir"; then

if ! { test -f "$puppetlock" && test -d "$lockdir"; } then 

(请注意,!a || !b相当于!(a && b),但与!a && !b不同)