É bom estar ciente de que há problemas com eval ( este e isso ) e echo ( aqui ). Você deve evitar eval , é fácil usar mal.
Mesmo que esses comandos sejam completamente seguros em seus casos particulares, sugiro que você solte eval . Seu código é realmente complicado por causa disso.
Seu primeiro exemplo fica muito mais limpo com matrizes. Isso funciona no GNU bash 4.4.12 no meu Debian:
# preparing variables
unset -v list s s1 s2
declare -a list=( foo 'X Y' bar baz )
declare -a s
declare -A s1=( [foo]='FOO 1' [bar]='BAR 2' [baz]='BAZ beep; eject /dev/sr0' )
declare -A s2=( [foo]='oof oof' [bar]='rab rab' [baz]='zab zab' [X Y]='9')
# your code rewritten, we don't even need a counter
for j in "${list[@]}"
do
s+=( "${s1[$j]}" "${s2[$j]}" )
done
# checking contents of s
printf '%s\n' "${s[@]}"
Dica: pesquise "matrizes indexadas", "matrizes associativas" e seu uso em bash .
Observe que o elemento com espaço ( X Y ) não é nada especial para mim; mas isso quebraria seu código. Eu também posso ter BAZ beep; eject /dev/sr0 no meu s1 ; Eu desafio você a definir s1baz='BAZ beep; eject /dev/sr0' , ter baz na sua matriz list , executar seu código e ver o que acontece. Isto é o que o eval é capaz de fazer. Agora imagine que coloquei rm -rf ~/ em vez de eject … .
O segundo exemplo pode ser muito simplificado como:
sed -i "17i$sed17line" "$file"
Você parece ter algum preconceito em relação a eval + echo desde que criou uma engenhoca que as usa duas vezes quando nenhuma é necessária. Talvez seja porque suas variáveis nem sempre se expandem para seus valores quando você quer isso; Nesse caso, investigue a diferença entre aspas simples ( ' ) e aspas duplas ( " ) em bash .
Parabéns por ter dúvidas e fazer a pergunta.