2011-11-08 100 views
0

我創建了一個bash腳本,它將使用SQL * Loader加載CSV文件。請參考下面的代碼:在bash腳本中使用通配符

#!/bin/bash 
FILENAME = '/u02/logs/$(date -d '2 days ago' +%Y-%m-%d)*.csv' 

# LOAD CSV FILE USING SQL*LOADER 
sqlldr username/[email protected] control=control.ctl data=$FILENAME 

然而,當我嘗試運行此腳本時,我收到以下錯誤:使用SQL * Loader-500:無法打開文件(/ U02 /日誌/ * 2011-11 -06 * .csv)。我發現問題是我的*通配符,它​​被解釋爲一個字符串,而不是bash中的通配符。

有沒有辦法告訴bash的,我的星號(*)是一個通配符,而不是一個字符串?

感謝您的支持。

+0

您的'$ FILENAME'使用單個滴答聲。還沒有嘗試過,但你有沒有嘗試過使用雙引號? –

+0

是的。實際上,我可以回顯完整的$ FILENAME。但是當我將它放入我的SQL * Loader中時,它根本就不起作用。 – epsac

+0

你會發現解決方案將比你期待的更難。 –

回答

0

我不知道關於SQLLDR,但我想你可以嘗試:

#!/bin/bash 
FILENAME = '/u02/logs/$(date -d '2 days ago' +%Y-%m-%d)*.csv' 

# LOAD CSV FILE USING SQL*LOADER 
for fname in $(ls $FILENAME); do 
    sqlldr username/[email protected] control=control.ctl data=$fname 
done 

希望它有助於

+0

你的代碼就像一個魅力!我想知道爲什麼我不能像我在echo中所做的那樣將我的文件傳遞給SQL * Loader。無論如何,非常感謝! :-) – epsac

+0

@ user692533:echo不會向您顯示您認爲的內容。比較運行'echo「$ FILENAME」','echo $ FILENAME'和'echo data = $ FILENAME'的結果。第一個顯示了FILENAME變量中的實際內容,包括文字星號。在第二種情況下,shell將參數傳遞給'echo'之前進行文件名匹配,因此您會看到匹配的文件名而不是星號。在最後一種情況下,shell認爲「data =」是它應該查找的文件名的一部分,沒有找到任何匹配的內容,所以它保留了字面星號。 –

+0

@Gordon Davisson謝謝你讓我知道:-) – epsac

0

也許你可以試試:

sqlldr username/[email protected] control=control.ctl data="$FILENAME" 
+0

感謝哥們!我嘗試了雙引號,但是SQL * Loader仍然將它解釋爲一個字符串。 :-( – epsac

0

您使用單一蜱是問題。另外,我不習慣看bash代碼在等號周圍有空格。再一次,我是老傻瓜。所以這是我會做的:

FILENAME=/u02/logs/"$(date -d '2 days ago' +%Y-%m-%d)*.csv" 

這應該這樣做。因爲它們是字面的,所以你不需要引用第一部分。只有在需要解釋器做一些插值時才使用雙引號。如果您不希望翻譯人員觸摸它,請使用單引號。

+0

再然後,你可以開始雙引號之後等號。這真的只是一個風格問題。 –

+0

我想你的代碼。我甚至去掉空格上了等號。當我使用回聲顯示我的變量FILENAME的值,它顯示'/u02/logs/2011-10-05_other_values.csv'這是正確的,但是sql * loader仍然把它解釋爲'u02/logs/2011/10/05 * .csv' 。順便說一句,我使用紅帽Linux – epsac

+0

感謝史蒂夫,但在SQL * Loader仍然要解釋我的*(星號)作爲字符串不是通配符 – epsac

0

只需使用

FILE=/u02/logs/$(date -d '2 days ago' +%Y-%m-%d)*.csv 

我也注意到另外*logs/後您的錯誤消息,但不在您的代碼中。相應地調整。 如果沒有匹配通配符模式的文件,*將保留在文件名中。另外,請注意存在多個匹配文件的情況。

+0

哇,你真是一個很好的調試器朋友!我嘗試刪除單個qoutations.It不起作用。不管怎麼說,還是要謝謝你 :-) – epsac