Índice
1. Manipulando las expansiones de variables
2. Magia con el $IFS
3. Manejo de descriptores de fichero
3.1. Introducción a redirecciones
3.2. Operaciones de redirección
3.3. Modo de uso
3.4. Otras redirecciones
4. Manejo de señales
5. Colofón
Para hacer el artículo más breve y llevadero me limitaré a exponer ejemplos
con alguna explicación ocasional. El objetivo es despertar vuestra curiosidad y
que experimentéis por inciativa propia.
Todo lo que aquí se comenta está explicado en la página man del sh(1)
1. Manipulando las expansiones de variables
Ya que siempre estamos manejando texto que entra, texto que sale, tuberías y
demás historias, existen algunos mecanismos prácticos antes de recurrir al
Perl, Awk o Sed. Y de paso nos ahorramos algunos ciclos.
Disponemos de unos pocos operadores para controlar la expansión de las
variables del shell, aquí os describo los más sencillos.
- Valor alternativo: ${variable:-valor} Si variable
NO está definida entonces la expansión produce valor, si
variable sí está definida se expande su contenido.
- Valor fijo: ${variable:+valor} Al contrario que el
anterior si variable está definida entonces la expansión es valor, si
variable NO está definida entonces se produce una cadena vacía
"".
- Eliminar prefijo: ${variable#prefijo} Donde
prefijo es un patrón (expresión regular en formato sh). Dicho patrón se
aplica al contenido de variable por el principio y si hay coincidencia,
ésta se omite en la expansión. En caso de que no coincida se expande
variable de forma normal
- Eliminar sufijo: ${variable%sufijo} Igual que el
anterior salvo que se busca el patrón desde el final del contenido de
variable.
Los operadores para eliminar prefijo y sufijo buscan la coincidencia más
corta, existen versiones para buscar la coincidencia más larga:
${variable##prefijo} y
${variable%%sufijo} respectivamente. Además, donde
indicamos el prefijo o sufijo podemos poner cualquier expresión que
pueda ser evaluada por el shell. Como por ejemplo:
etanol@botijo:~$ texto=piri-jandemor
etanol@botijo:~$ prefijo=piri-
etanol@botijo:~$ echo ${texto#piri-}
jandemor
etanol@botijo:~$ echo ${texto#$prefijo}
jandemor
etanol@botijo:~$ echo ${texto#$(echo piri-)}
jandemor |
Hay unos cuantos más, pero estos me han parecido los más útiles. Vamos con
unos ejemplos:
#! /bin/sh
# join.sh: Script para concatenar todos los ficheros 00-nombre
# 01-nombre 02-nombre etc... en nombre. Esto se hace para todos los ficheros
# que empiecen por dos dígitos y un guión en el directorio actual.
for parte in [0-9][0-9]-*; do # El comando ls(1) ya hace "sort"
cat $parte >>${parte#[0-9][0-9]-}
done
|
Otro ejemplo:
#! /bin/sh
# decent-extension.sh extensión_vieja extensión_nueva: Script para renombrar
# todos los ficheros con "extensión_vieja" por "extensión_nueva". Por ejemplo:
# ./decent-extension.sh TXT txt
for fichero in *.$1; do
mv -v $fichero ${fichero%.$1}.$2
done
|
2. Magia con el $IFS
IFS son las siglas de Inter Field Separator, que significa separador
de campos. Se trata de una variable muy especial para el shell, en ella se
encuentran todos los caracteres que pueden ser delimitadores de campo o de
palabra. Viene a ser como el FS del awk
Esta característica del shell no tiene mucho más misterio. Para verificarlo
usaremos un ejemplo:
#! /bin/sh
# which.sh nombre_binario: Implementación alternativa del conocido programa.
#
# Esto sirve de emergencia en caso de no disponer o no encontrar el verdadero
# comando "which".
IFS=":"
for dir in $PATH; do
if test -x "${dir%/}/$1"; then
# Eliminamos la "/" del final si la hay, por si acaso
echo "${dir%/}/$1"
exit 0
fi
done
exit 1
|
|