Substitua a variável lida de um arquivo de texto (para que possam ser interpretadas)

Substitua a variável lida de um arquivo de texto (para que possam ser interpretadas)

Quero armazenar em um arquivo de texto alguma instrução select que contenha variáveis ​​como uma data:

$ cat res.txt
select field1, field2 from log and log_time~'"${TODAY}"*'

Quero usar um script que analise esse arquivo e, para cada instrução, execute-o. Claro, ${TODAY}será substituído por uma variável.

Infelizmente, ${TODAY}nunca é substituído por uma data quando leio o arquivo ...

Existe uma maneira de conseguir isso?

ATUALIZAR:

Digamos que eu queira iterar em um arquivo que contém algumas instruções sql e queira executá-las usando psql (postgres)

Aqui está o arquivo:

$cat sql.res
select path from log where log_host='toto' and log_time~'"${TODAY}"*' and log_msg='POLICY MISSING' and entry_status!='ACK' and path~'^/logs-${cli}/"${THREE_MONTHS_AGO}"_[0-9][0-9][0-9][0-9][0-9][0-9](_[0-9]{1,2}\.|\.)log(ptr|initial_ptr|account_ptr)?\.bz2$';

Agora, em um script bash, quero:

$cat script.sh
TODAY=$(date "+%Y-%m-%d")
THREE_MONTHS_AGO=$(date -d "$TODAY -91 days" "+%Y-%m-%d")
THREE_MONTHS_AGO_2=$(date -d "$TODAY -92 days" "+%Y-%m-%d")
ONE_MONTH_AGO=$(date -d "$TODAY -36 days" "+%Y-%m-%d")
ONE_MONTH_AGO_2=$(date -d "$TODAY -37 days" "+%Y-%m-%d")
YESTERDAY=$(date -d "$TODAY -1 day" "+%Y-%m-%d")
while read item; do
    psql -P pager=off -t -c "$item" log | sed -e 's|^ *||' -e '/^$/d' > result.txt
done < sql.res

Infelizmente, as variáveis ​​não são usadas no script. Então eu tentei avaliar. Eu tenho assim:

$while read item; do
    c=$(echo $item | sed "s:':@:g" | sed "s:|:EE:g" | sed "s:(:AA:g" | sed "s:):BB:g" | sed 's:]{:TT:g' | sed 's|\.|OO|g')
    b=$(eval echo ${c} 2>&1)
    d=$(echo $b | sed "s:@:':g" | sed "s:EE:|:g" | sed "s:AA:(:g" | sed "s:BB:):g" | sed 's:TT:]{:g' | sed 's:OO:\\\.:g' )
    echo  "-> $b"
done < sql.res

Mas eu tenho alguns problemas com

\.

Responder1

Você pode simplesmente substituir a string variável pelo valor:

sed -e "s/\${TODAY}/$TODAY/g" res.txt

Mas:

  • Tenha certeza absoluta de que você executou a variável por meio de um arquivo confiável (como criado pelo banco de dados fornecido ou parte de uma API de linguagem de programação popular,nãoalgo caseiro)mecanismo de fuga.
  • Você também terá que escapar de qualquer personagemespecífico ased(e você não pode simplesmente adicionar barras invertidas antes de cada caractere).
  • Você está usando dois níveis de cotações, o que provavelmente não pretendia.
  • Por favor, use uma linguagem melhor que o Bash para isso. É horrível esse tipo de coisa, porque todo o negócio de cotação e fuga que complica e torna tudorealmenteé fácil perder casos especiais. Python, Ruby e até PHP lidam com esse tipo de coisa muito melhor que o Bash.

informação relacionada