Eu tenho um arquivo de texto que geralmente é preenchido com várias linhas que quero "imprimir" com um loop while. O texto dentro deste arquivo contém variáveis - meu problema é que essas variáveis não são interpretadas ao contrário de uma string de teste semelhante contendo variáveis armazenadas dentro do script. É possível também interpretar essas variáveis do meu arquivo externo ou tenho que analisá-las antes, etc.? Qual é a diferença entre $LINE_INSIDE
e $LINE_OUTSIDE
? Eu tentei algumas sugestões de outras perguntas como ${!varialbe_name}
e construções diferentes com sinais de aspas, mas sem sorte até agora.
#!/bin/bash
# color.sh
BLUE='\033[1;34m'
NC='\033[0m' # No Color
LINE_INSIDE="${BLUE}Blue Text${NC}"
echo -e ${LINE_INSIDE}
while read LINE_OUTSIDE; do
echo -e ${LINE_OUTSIDE}
done < text_file
Resultado:
Informações Adicionais: Eu (de fato) também tenho comandos shell no meu arquivo de texto de entrada que não devem ser executados. Apenas as variáveis devem ser expandidas.
Provavelmente faria mais sentido escrevê-lo como:
do que usar um
while read
loop ( essa não é a sintaxe correta para ler linhas btw ).Claro que isso significa que o código lá seria interpretado. A
$(reboot)
lá, por exemplo, causaria uma reinicialização, mas é mais ou menos o que você está pedindo.Isso também pressupõe que o
text_file
não contém umaEOF
linha.Outra abordagem que faria apenas substituição de variável (variável de ambiente) (e não substituição de comando, por exemplo) seria usar GNU
gettext
:envsubst
Ou para que apenas essas duas variáveis sejam expandidas:
Em versões mais recentes de
bash
(desde a versão 4.4 ou mais), há ainda outra maneira complicada de expandir indiretamente variáveis em strings, sem ter que ficar cheioeval
: a@P
transformação de parâmetro (= expand como em prompts , incluindo, mas não limitado a substituições de variáveis).