Obtém o conteúdo da string de passagem de um script

2

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
    
por Arianna Angeletti 29.03.2018 / 20:41

3 respostas

4

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
    
por 29.03.2018 / 20:47
3

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
    
por 29.03.2018 / 21:47
0

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.

    
por 30.03.2018 / 05:33