Esta es una pregunta realmente específica. Tengo un script que, por lo que parece, podría haberlo hecho más complicado de lo necesario en nombre de la eficiencia. ¿Es realmente eficiente? No lo sé. ¿Es la forma correcta de escribirlo? No lo sé.
Es por eso que estoy haciendo esta pregunta, quiero saber si el código a continuación se puede mejorar de cómo está escrito es la forma de escribirlo. Si no estaba claro, soy un novato en golpear pero mi guión completa su propósito.
Este código está tratando de definir las variables s$counter= s1, s2, s3, s4...
en términos de las variables definidas previamente s1$j
y s2$j
con j
una cadena que es un elemento de una lista (todas definidas previamente).
counter=1
for j in ${list[@]}
do
eval s$counter=$(eval "echo \$s1$j")
eval s$((counter+1))=$(eval "echo \$s2$j")
counter=$((counter+2))
done
Es confuso, pero desnudo conmigo. El eval
significado interno significa $(eval "echo \$s1$j")
devolver el valor de s1$j
. El segundo eval
, que significa evaluar, s$counter =...
está destinado a definir las variabless1, s2, s3, s4 ...
Entonces, un ejemplo sería: digamos que para el primer bucle foor j=a
entonces $(eval "echo \$s1$j") == $s1a
, con el valor de s1a
definido anteriormente en el script, por ejemplo, que sea " s1a=10
", para que cuando eval
se evalúe el segundo tengamos el comando que dice " s1=10
".
Funciona, pero ¿podría pasar algo que haga de esto una posible amenaza de memoria o algo así?
La misma idea con esta línea de código.
eval $(echo "sed -i '$(eval echo '17i$sed17line')' $file")
donde sed17line
es lo que quiero agregar en la línea 17 de file
. Depende de para qué quiero usar el script, por eso lo estoy usando como variable y, por lo tanto, por qué estoy usando una combinación de echo
y eval
.
Una vez más, intenté todo lo que podía pensar que tenía sentido hasta que el resultado fue lo que quería.
Solo quiero asegurarme de que todo esté correcto y, si hay una manera de mejorarlo, debería buscar esa información. ¡Gracias!
Respuestas:
Es bueno tener en cuenta que hay problemas con
eval
( esto y esto ) yecho
( aquí ). Debe evitarloeval
, es fácil de usar mal.Incluso si estos comandos son completamente seguros en sus casos particulares aquí, le aconsejo que abandone
eval
. Su código es realmente demasiado complicado debido a eso.Su primer ejemplo se vuelve mucho más limpio con las matrices. Esto funciona en GNU bash 4.4.12 en mi Debian:
Sugerencia: busque "matrices indexadas", "matrices asociativas" y su uso en
bash
.Tenga en cuenta que el elemento con espacio (
X Y
) no es nada especial para mí; pero rompería tu código También puedo tenerBAZ beep; eject /dev/sr0
en mis1
; Te reto a configurars1baz='BAZ beep; eject /dev/sr0'
, tenerbaz
en tulist
matriz, ejecutar tu código y ver qué pasa. Esto es lo queeval
es capaz de hacer. Ahora imagina que pongo enrm -rf ~/
lugar deeject …
.El segundo ejemplo se puede simplificar enormemente como:
Parece que tiene algún sesgo hacia
eval
+echo
ya que creó un artilugio que los usa dos veces cuando no se necesita ninguno. Tal vez sea porque sus variables no siempre se expanden a sus valores cuando lo desea; si es así, investigue la diferencia entre'
comillas simples ( ) y dobles ("
) enbash
.Felicitaciones por tener dudas y hacer la pregunta.
fuente
eval
yecho
. Tal vez sea la forma en que estoy pensando que los pasos del código deberían ser los que me llevaron a esas respuestas, pero no obstante lo hicieron, funcionaron y tuvieron sentido para mí. Ahora estoy tratando de mejorar el código.eval
, probablemente debería estarlo. ¿Diría que eval es portátil? Sin embargo, haré todo lo posible para comprender la forma en que me sugirió.var=$(<prog>)
que ejecute prog como un subproceso y asigne su salida a variable. Noeval
se necesita en este caso.