2012-07-17 85 views
0

我正在編寫一個批處理腳本bash,需要先檢查是否存在一個文件夾以知道是否運行某個將創建並填充夾。我之前做過類似的事情,在改變目錄和從存儲變量中查找目錄方面做得很好,但由於某種原因,我只是在這裏丟失了一些東西。在bash shell腳本中檢查目錄的問題

下面大致介紹腳本的工作原理。

if [ -d "$net_output" ] 
then 
    echo "directory exists" 
else 
    echo "directory does not exist" 
fi 

當我運行這個腳本時,我通常會在前面的行中回顯$ net_output,看看它會評估什麼。當腳本運行時,我得到我的代碼塊說「目錄不存在」,但是當我然後複製粘貼之前回顯的$ net_output目錄路徑到shell終端中時,它改變目錄就好了,證明目錄確實存在。我在戴爾機器上使用Ubuntu 12.04。

非常感謝您提供任何幫助。讓我知道我可以提供什麼額外的信息。

+1

你確定你已經獲得'$ net_output'的預期值嗎?有沒有可能它的值是一個你不在的目錄的相對路徑?代碼本身似乎很好,所以我會檢查這個值,以確保它是你期望的 – Cfreak 2012-07-17 16:12:51

+1

另一種可能性是它實際上是一個目錄的符號鏈接,在這種情況下'cd'可以工作,但是'[-d .. 。]'將返回false ... – twalberg 2012-07-17 16:22:38

+0

@twalberg:測試必須成功獲得有效的符號鏈接。從標準:'除-h路徑名和-L路徑名初選外,如果路徑名參數是符號鏈接,則測試應通過解析符號鏈接並使用鏈接引用的文件來評估表達式。' – 2012-07-17 17:41:52

回答

2

當有人張貼這樣的問題,我遇到的最常見的情況有以下幾種:

的變量包含文字引號。 Bash不會遞歸地解析引號,它只解析命令行給出的「外層」引號。

$ mkdir "/tmp/dir with spaces" 
$ var='"/tmp/dir with spaces"' 
$ echo "$var" 
"/tmp/dir with spaces" 
$ [ -d "/tmp/dir with spaces" ]; echo $? 
0 
$ [ -d "$var" ]; echo $? # equivalent to [ -d '"/tmp/dir with spaces"' ] 
1 

2.變量包含相對路徑和當前目錄是不是你所期望的。檢查echo "$PWD"的值是否符合您的預期。

3.該變量是從一個文件中讀取的,該文件的結尾爲CRLF(\ r \ n)。 Unix和類Unix系統僅使用LF(\ n)作爲行尾。如果是這樣的話,路徑最後會包含一個CR(\ r)。終點處的CR將在終端中「不可見」。在調試腳本時與printf '%q\n' "$var"進行檢查。請參閱BashFAQ 52關於如何擺脫它們。