在bash脚本中的“if”中查找哪个参数为false

时间:2013-08-27 14:01:32

标签: bash if-statement

我的目录中应该有三个文件。我需要知道他们哪些在不同的时间丢失了 我正在尝试使用“if”(放入crontab)的

的bash脚本
if [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ; then
echo "All three exist" >> logfile
else
echo "<*NAME OF FILE THAT IS NOT PRESENT*> is not present" >> logfile
fi

我知道可以使用嵌套的“if”单独为所有文件获取它。但我不想为每个文件使用单独的“if”。 我也知道可以使用for循环。但我想知道上述内容是否可行 - 将脚本保持在最小尺寸。

谢谢!

3 个答案:

答案 0 :(得分:2)

通常,无法确定&&链中的哪个条件失败。

但是,使用for循环并不是那么糟糕:

success=true
for f in file1 file2 file3; do
    if ! [ -f $f ]; then
        success=false
        echo "$f is not present" >> logfile
    fi
done
if $success; then
    echo "All three exist" >> logfile
fi

如果该信息有价值,它还可以让您确定是否存在多个文件。

答案 1 :(得分:1)

创建一个函数来为你做测试,然后使用函数的副作用来检测布尔快捷键:

##
# Test that a file exists. Here we use standard output to just visibly see
# that the function is running, but for a more programmatic solution, 
# store state: You could use a shared variable to store the names of files
# that you know exist, or you could just keep a counter of the number of times
# this function is run. Use your imagination.
file_exists() {
  printf 'Testing that %s exists\n' "$1"
  test -f "$1"
}

if file_exists file1 && file_exists file2 && file_exists file3; then
    …
fi

答案 2 :(得分:0)

我在想这件事:

for i in {1..3} 
  do  
    ...do some things...file$i 
    ...do more things...
  done

但这会增加另外一层抽象,而实际上只需要三个文件。