É 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.