在bash脚本中使用通配符

时间:2011-11-08 04:52:00

标签: database linux bash unix sql-loader

我正在创建一个使用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我的星号(*)是通配符而不是字符串?

感谢您的支持。

4 个答案:

答案 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/,但不在您的代码中。相应调整。 如果没有与通配符模式匹配的文件,*将保留在文件名中。另外,在存在多个匹配文件的情况下要小心。