Ejecución de comandos

Asignar la salida de un comando (no el estado de retorno) a una variable

variable=$(who)
variable=`who`
Las comillas invertidas son más portables, no confundir con comillas simples ' que sirven para evitar expansión de variables, pero la construcción $(...) es más legible.

xargs puede capturar la salida de un comando para convertirla en la lista de argumentos de un programa, tal como lo hace set

Expansión aritmética

El comando expr permite la ejecución de algunos comandos aritméticos, pero debe invocar un nuevo shell para ejecutarse. La alternativa, más eficiente es $((...))

#!/bin/sh
x=0 # "0" es una cadena de texto
while [ "$x" -ne 10 ]; do
echo $x
x=$(($x+1)) # pero aquí se trata como un número
done

exit 0

Expansión de parámetros

Si intentamos ejecutar esto

#!/bin/sh

for i in 1 2
do
mi_programa $i_tmp
done
obtendremos un error

mi_programa: too few arguments
Lo que ha ocurrido es que se ha intentado sustituir el valor de la variable $i_tmp, que no existe. En consecuencia no se transmite ningún parámetro a mi_programa . Hay que proteger la expansión del nombre de variable que nos interesa ${i}_tmp

Algunas sustituciones

${param:-default} Si param es nulo toma el valor default
${#param} Proporciona la longitud de param
${param%word} Desde el final, elimina la parte más breve de param que se corresponde con word y envía el resto.
${param%%word} Desde el final, elimina la parte más larga de param que se corresponde con word y envía el resto.
${param#word} Desde el principio, elimina la parte más breve de param que se corresponde con word y envía el resto.
${param##word} Desde el principio, elimina la parte más larga de param que se corresponde con word y envía el resto.

Cómo funciona

#!/bin/sh

unset foo
echo ${foo:-bar}

foo=fud
echo ${foo:-bar}

foo=/usr/bin/X11/startx
echo ${foo#*/}
echo ${foo##*/}

foo=/usr/local/etc/local/networks
echo ${foo%local*}
echo ${foo%%local*}

exit 0
esta es la salida

jorge@debian:~$ sh prueba.sh 
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc/
/usr/
tiene unas aplicaciones bastante útiles

for doc in *.html ; do ; html2pdf $doc > $(doc%html)pdf ; done

No hay comentarios:

Publicar un comentario