我正在创建一个使用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/password@localhost control=control.ctl data=$FILENAME
但是,当我尝试运行此脚本时,我收到以下错误:SQL * Loader-500:无法打开文件(/ u02 / logs / *
2011-11-06 *
的.csv)。我发现问题是我的*通配符,它被解释为字符串而不是bash中的通配符。
有没有办法告诉bash我的星号(*)是通配符而不是字符串?
感谢您的支持。
答案 0 :(得分:0)
也许你可以试试:
sqlldr username/password@localhost control=control.ctl data="$FILENAME"
答案 1 :(得分:0)
您使用单一蜱是问题所在。另外,我不习惯看到bash代码在等号周围有空格。然后,我又老了。所以这就是我要做的事情:
FILENAME=/u02/logs/"$(date -d '2 days ago' +%Y-%m-%d)*.csv"
应该这样做。你不需要第一部分的引号,因为它们是字面的。当你需要解释器做一些插值时,只使用双引号。如果您不希望解释器触摸它,请使用单引号。
答案 2 :(得分: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/password@localhost control=control.ctl data=$fname
done
希望有所帮助
答案 3 :(得分:0)
只需使用
FILE=/u02/logs/$(date -d '2 days ago' +%Y-%m-%d)*.csv
我还会在错误消息中的*
后面注明其他logs/
,但不在您的代码中。相应调整。
如果没有与通配符模式匹配的文件,*
将保留在文件名中。另外,在存在多个匹配文件的情况下要小心。