Ejecución de comandos

Cuando escribimos scripts, solemos tener que capturar el resultado de ejecución de un comando para usarlo en el script shell. Es decir, queremos ejecutar un comando y colocar la salida del comando en una variable. Puede hacerlo usando la sintaxis $ (command) que ya vimos anteriormente en el ejemplo del comando set. También existe una forma más antigua, ‘command‘, que se sigue usando.

comandos_ejemploTodos los scripts nuevos deberían usar la forma $(...), que se introdujo para evitar algunas reglas bastantes complejas que se encargaban del uso de los caracteres $, ` y \ dentro de un comando entrecomillado. Si se usa un tic invertido dentro de la construcción `...`, debe ir precedido del carácter \. Estos caracteres suelen confundir a los programadores, y a veces, incluso los programadores más expertos han de realizar varias pruebas antes de obtener el entrecomillado correcto en los comandos que se encuentran entre tics invertidos.

El resultado de $ (command) es, simplemente, la salida del comando. Tenga en cuenta que no se trata del estado de entorno del comando, sino de la cadena de salida, tal como se muestra a continuación:

ejemplo_ejecucion_comandosComo el directorio actual es una variable de entorno shell, la primera línea no necesita usar esta construcción de ejecución de comando. Sin embargo, el resultado de who necesita esta construcción si tiene que estar disponible para el script.

Si desea obtener el resultado en una variable, sólo tiene que asignarla con toda normalidad:

quienestaLa capacidad de introducir el resultado de un comando en una variable de script es muy potente, ya que facilita el uso de los comandos existentes en el script y captura su salida. Si alguna vez tiene que convertir un conjunto de parámetros que son la salida de un comando en salida estándar y tiene que capturarlo como argumentos de un programa, recuerde que el comando xargs lo puede hacer en su nombre.

Cuando el comando que desea invocar enviá espacios en blanco antes del texto deseado, o más salidas de las necesarias, puede surgir un problema. En dicho caso, puede usar el comando set tal como vimos anteriormente.

Expansión aritmética

Ya hemos usado el comando expr, que permite el procesamiento de sencillos comandos aritméticos, pero es de lenta ejecución porque para procesar el comando expr hay que invocar un nuevo shell.

Una mejor alternativa más reciente es la expansión $((...)). Al introducir la expresión que desea evaluar dentro de $((...)), puede realizar una operación aritmética sencilla mucho más fácilmente:ejemplo_expansion_aritmeticanota_expansion_aritmeticaExpansión de parámetros

Hemos visto el modo más sencillo de asignación y expansión de parámetros:

expansion_parametros1Cuando queramos añadir caracteres extra al final de una variable surgirá un problema. Suponga que desea escribir un breve script para procesar los archivos denominados temp1 y temp2. Podemos intentar:

proceso_maloPero con cada bucle obtendremos:

salida_expansionEl problema es que la shell intentó sustituir el valor de la variable $temp, que no existe. La shell no contempla este error, lo único que hace es no sustituir nada, de manera que no transmite ningún parámetro a Mi_proceso_secreto. Para proteger la expansión de la parte $i de la variable, tiene que introducir i entre corchetes:

proceso_bueno

En cada bucle, el valor de i es sustituido por $(i) para proporcionar los nombres de archivos reales. El valor del parámetro se sustituye en una cadena.

proceso_salida

Se pueden realizar muchas sustituciones de parámetros en la shell. A menudo, las sustituciones proporcionan una solución elegante para la mayoría de problemas de procesamiento de los parámetros. Los más comunes se muestran a continuación:

expansion_parametrosEstas sustituciones suelen resultar útiles cuando se trabaja con cadenas. Las cuatro últimas, que eliminan partes de las cadenas, son especialmente útiles para procesar los nombres de archivos y rutas, tal como vemos en el siguiente ejemplo.

Procesamiento de parámetros

Cada parte del siguiente script muestra los operadores de correspondencia de parámetros:

listado_script_proceso_parametrosEsto produce el siguiente resultado:

salida_script_proceso_parametrosVeamos como funciona:

La primera secuencia ${foo:-bar}, proporciona el valor bar, ya que, cuando se ejecutó la sentencia, foo no tenía valor. La variable foo no se modifica, porque no está configurada.

nota_proceso_parametrosLa sentencia {foo#*/}] se corresponde y elimina únicamente la / izquierda (recuerde que * se corresponde con cero o más caracteres). {foo##*/} se corresponde y elimina todo lo que puede, por eso elimina la / que se encuentra más a la derecha y todos los caracteres que la precedan.

La sentencia {bar%local*} se corresponde con los caracteres de la derecha hasta que aparece la primera ocurrencia de local (seguido por cualquier número de caracteres), pero {bar%%local*} se corresponde con todos los caracteres posibles desde la parte derecha hasta que encuentra el local posicionado más a la izquierda.

Tanto UNIX como Linux se basan profundamente en la idea de los filtros, por eso, normalmente, hay que redireccionar el resultado de una operación manualmente. Imaginemos que queremos convertir un archivo GIF en JPEG usando el programa cjpeg:

$> cjpeg image.gif > image.jpg

Posiblemente queramos realizar esta misma operación sobre varios archivos. Podemos realizar automáticamente el redireccionamiento de forma sencilla:

ejemplo_procesoEste script, giftojpeg, crea un archivo JPEG para cada archivo GIF en el directorio actual.

atras

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s