2012-12-25 119 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