переменные не заменяются внутри текста, читаемого из файла - оболочка Korn - PullRequest
0 голосов
/ 11 мая 2018

Это должна быть простая ошибка. Но не удается решить с несколькими попытками.

Использование unix Korn shell Я хочу прочитать файл sql в переменную unix ksh (файл имеет правильный отступ (отформатирован)). Наряду с этим я хочу разрешить все переменные $ в тексте SQL.

ниже - команда, которая читает файл как есть. Файл query.sql (фактический файл больше и имеет больше переменных) имеет $MONTH и $YEAR, и я хочу, чтобы фактическое значение было заменено в qry.

IFS используется, чтобы избежать удаления разрывов строки. Ниже приведен тестируемый код ksh

    #!/usr/bin/ksh
    createqry()
    {
       MONTH=$1
       YEAR=$2
       IFS=
       qry=$(cat query.sql)
       echo $qry
   }
   QRY=$(createqry $month,$year)
   #write the QRY to file
   echo "$QRY" > outputqry.sql

Например: query.sql

Select * from table where trans_month=$MONTH and trans_Year=$YEAR

outputqry.sql должно быть

Select * from table where trans_month=10 and trans_Year=2017

Для downvote's - я искал в Google и SO с той же проблемой и не смог ее решить. Отсюда и пост

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Было бы проще, если бы все переменные в query.sql были заключены в фигурные скобки, такие как ${month}. Когда вы включаете фигурные скобки в соответствующий шаблон, вам не нужно беспокоиться о $year и $yearly. Я добавил sort -r, пытаясь обойти переменные.
Мне нужен был неизвестный символ в переменных для создания команды sed. Я использовал = и пропустил переменные, которые имеют одну (в результате два = s в выводе env).
Вы пометили вопрос с помощью ksh, поэтому следующее (с заменой процесса) не будет работать:

sed -f <(env | grep -Ev "=.*="| sort -r | sed -r 's/(.*)=(.*)/s=$\1=\2=g/') query.sql

В POSIX вам нужно

env | grep -Ev "=.*="| sort -r | sed -r 's/(.*)=(.*)/s=$\1=\2=g/' > /tmp/srd.wrk
sed -f /tmp/srd.wrk query.sql
0 голосов
/ 12 мая 2018

Похоже, что вы хотите, чтобы ссылки $MONTH и $YEAR были оценены, и хотя это выполнимо, вы столкнетесь с проблемой, что * также будет оцениваться (например, * заменяется именем каждого файла в текущем каталоге).

Кто-то другой может найти решение, если / как оценивать переменные, но не звездочку ... пока я собираюсь предложить другой подход ... то, что я обычно делаю, когда хочу передать переменные в шаблон * sql скрипт.

Первым шагом является переформатирование сценария шаблона с использованием имен в качестве заполнителей, которые также служат недопустимыми идентификаторами для механизма обработки данных (например, предотвращает запуск сценария шаблона в базе данных, если заполнители не были должным образом заменены). Что-то вроде:

$ cat query.sql
Select * from table where trans_month=MONTH and trans_Year=YEAR

Предполагая, что у нас есть текущие назначения переменных ...

$ YEAR=10 MONTH=2018

Теперь у вас есть несколько вариантов замены заполнителей MONTH и YEAR в зависимости от вашей оболочки (и версии) и ваших предпочтений для команд. Пара примеров:

# disable expansion of '*'

$ set -f

# let 'sed' replace place holders with variable values;
# make sure you use double quotes around the 'sed' patterns
# to ensure the variables are evaluated

$ x=$(sed "s/MONTH/${MONTH}/g ; s/YEAR/${YEAR}/g" query.sql)

# let's see what we got

$ echo "${x}"
Select * from table where trans_month=10 and trans_Year=2014

С bash вы можете использовать замену процесса, если предпочитаете:

$ set -f

$ read x < <(sed "s/MONTH/${MONTH}/g ; s/YEAR/${YEAR}/g" query.sql)

$ echo "${x}"
Select * from table where trans_month=10 and trans_Year=2014
...