2012-12-25 35 views
0

我发现这个bash脚本(它工作)。这个脚本起着重要的作用。脚本的整个代码质量很好。我只是想知道下面的建设是否有意义?bash if语句

if [ "${G_FILE}" != "" ] && [ -f "${G_FILE}" ] && [ -r "${G_FILE}" ]; then 
.... 

手册上说:

[ -f FILE ] True if FILE exists and is a regular file. 
[ -r FILE ] True if FILE exists and is readable. 
[ STRING1 != STRING2 ] True if the strings are not equal. 

我的想法:

  1. [ -n "${G_FILE}" ][ "${G_FILE}" ]应该不是[ "${G_FILE}" != "" ]
  2. 只有[ -r "${G_FILE}" ]也会这样做。

对吗?

回答

2

除非你明确要求它是一个普通的文件,只使用-r就足够了。

+1

的确,没有'-f',目录也会通过。 – Noctua

+0

谢谢你的快速和良好的答案! – idobr

+0

我会保持-f和-r。 – idobr

3

首先,[只有在[[开始时才有意义,如果您需要严格遵守POSIX规范。 -f-r如果提供的选项参数正确引用为空,则测试应始终为false,因此第一个测试无用。 -r将适用于例如命名管道,套接字等。-f仅限于常规文件。

通常,您不需要检查文件是否实际可读。该检查可以捆绑在一起,测试使用该文件的东西是否大部分时间都是成功的。失败的重定向是错误的,最好在失败时返回适当状态的方式编写函数,而不是首先测试可读文件。

+0

非常感谢您的好解释。 []和[[]]也很重要,有很多材料和讨论。我正在去阅读它们。对于某人来说,感兴趣的是[太](http://serverfault.com/questions/52034/what-is-the-difference-between-double-and-single-square-brackets-in-bash) – idobr