Se o seu / bin / sh é, na verdade, / bin / bash, você pode usar indiretos de variáveis:
#!/bin/bash
STRS=" KW0 KW1 "
KW0_TEXT="text text text"
KW1_TEXT="text text text text"
for str in ${STRS}; do
var=${str}_TEXT
printf "%s\n" "${!var}"
done
Eu gostaria de obter, na saída, o conteúdo de KW0_TEXT
e KW1_TEXT
do "para" deste script:
#!/bin/sh
STRS=" KW0 KW1 "
KW0_TEXT="text text text"
KW1_TEXT="text text text text"
for str in ${STRS}; do
echo ${str}_TEXT
eval echo ${str}_TEXT
done
até agora, na saída, eu só tenho:
KW0_TEXT
KW0_TEXT
KW1_TEXT
KW1_TEXT
Se o seu / bin / sh é, na verdade, / bin / bash, você pode usar indiretos de variáveis:
#!/bin/bash
STRS=" KW0 KW1 "
KW0_TEXT="text text text"
KW1_TEXT="text text text text"
for str in ${STRS}; do
var=${str}_TEXT
printf "%s\n" "${!var}"
done
Se o seu / bin / sh é realmente / bin / bash, e sua versão é bastante recente, você pode usar um array associativo
#!/bin/bash
strs=( KW0 KW1 )
declare -A text=(
[KW0]="text text text"
[KW1]="text text text text"
)
for str in "${strs[@]}"; do
printf "%s\t%s\n" "$str" "${text[$str]}"
done
KW0 text text text
KW1 text text text text
O problema é que você está perdendo um literal $
no seu eval
use. Depois que a variável é substituída, o comando que você está avaliando é
echo KW0_TEXT
mas você quer
echo $KW0_TEXT
Deve ser:
eval echo '$'${str}_TEXT
No entanto, o método de variável indireta de Jeff Schaller é preferível se você estiver usando um shell que ofereça suporte a ele.
Tags shell-script string eval