Использование подстановочного знака в скриптах bash - PullRequest
0 голосов
/ 08 ноября 2011

Я создаю сценарий bash, который будет загружать файлы CSV с помощью SQL * Loader.Пожалуйста, обратитесь к следующему коду:

#!/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 голосов
/ 08 ноября 2011

Просто используйте

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

Я также отмечаю дополнительные * после logs/ в вашем сообщении об ошибке, но не в вашем коде.Отрегулируйте соответственно.* останется в имени файла, если нет файла, соответствующего шаблону подстановки.Также будьте осторожны, если существует более одного соответствующего файла.

0 голосов
/ 08 ноября 2011

Ваше использование одиночных тиков является проблемой. Кроме того, я не привык видеть в коде bash пробелы, окружающие знак равенства. Опять же, я старая школа. Вот что я бы сделал:

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

Это должно сделать это. Вам не нужны кавычки вокруг первой части, так как они буквальные. Используйте двойные кавычки только тогда, когда вам нужен интерпретатор для выполнения некоторой интерполяции. Используйте одинарные кавычки, если вы не хотите, чтобы переводчик прикасался к ним.

0 голосов
/ 08 ноября 2011

Я не знаю о 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

надеюсь, это поможет

0 голосов
/ 08 ноября 2011

Может быть, вы можете попробовать:

sqlldr username/password@localhost control=control.ctl data="$FILENAME" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...