.. _eval: .. index:: eval Preevaluación de órdenes ======================== Ya se ha dicho que la *shell* evalúa (o interpreta) la línea antes de ejecutarla. Por ejemplo, la orden:: $ ls -ld * muestra todos los ficheros y directorios no ocultos que se encuentran en el directorio de trabajo, ya que el intérprete sustituye el asterisco por cualquier nombre de fichero, y directorio y es la lista de ficheros y directorios lo que proporciona a :ref:`ls `. Ahora bien, si *protegemos* el asterisco, obtendremos un error:: $ ls -ld "*" ls: no se puede acceder a '*': No existe el fichero o el directorio ya que no hay nada que se llame *asterisco* y eso es precisamente lo que se pasa a :command:`ls`. La orden interna :command:`eval` preevalúa la orden:: $ eval ls -ld "*" Preevaluar la orden consiste en que la *shell* interprete la línea sin llegar a ejecutar la orden lo que, en este caso, se traduce en eliminar las comillas. Por lo tanto, al ejecutar :command:`eval` lo que conseguimos es obtener :code:`ls -ld *`, que es justamente la orden que primero pusimos. Tras la preevaluación, la orden es ejecutada por la *shell* y, como consecuencia, se interpretará el asterisco y :command:`ls` mostrará todo el contenido del directorio. El ejemplo no es muy útil, pero sirve para entender cómo funciona :command:`eval`, que es útil en muchos casos. Por ejemplo:: #!/bin/sh read -p "Escriba un valor para a: " a read -p "Escriba un valor para b: " b read -p "Escriba un valor para c: " c read -p "¿Qué variable quiere ver? " r eval echo $r vale \$$r