sed -e 's/bar/$foo/' <(echo $1)
imprime $foo
. O resultado de uma expansão de comando não está sujeito ao processamento de sintaxe do shell. Ele está sujeito apenas à geração de nome de arquivo (dividindo em palavras) o nome do arquivo (ou seja, globbing), quando você o usa dessa forma fora de aspas duplas.
Em qualquer shell, se você tiver o nome de uma variável em outra variável, poderá obter o valor dessa variável com eval
.
variable_name=$(sed -e 's/bar/foo/' <(echo $1))
case $variable_name in
*[!0-9A-Z_a-z]*) echo 1>&2 "Invalid variable name: $variable_name"; exit 3;;
esac
eval variable_value="\${$variable_name}"
for i in $variable_value; do …
Observe que $variable_value
não apenas divide o valor em partes delimitadas por espaços em branco, mas também executa globbing (ou seja, expande curingas em nomes de arquivos) nas partes. Para desativar a globbing, ligue antes para set +f
.
No ksh93, há um sinalizador especial que você pode usar ao definir uma variável var
, que informa ao shell que o valor da variável é um nome de variável e que $var
deve expandir para o valor da variável cujo nome é $var
. Além disso, você deve fazer foo
uma matriz, já que é realmente uma lista de strings e não uma string.
foo=(one two three)
typeset -n variable_name="$(sed -e 's/bar/foo/' <(echo $1))"
for i in "${variable_name[@]}"; do …