VARIABLES ESPECIALES
En UNIX existen unas variables especiales que pueden resultar útiles para conocer detalles sobre programas ejecutados, argumentos, etc.. Estas variables dependen de la shell utilizada, en el caso de ksh podemos destacar:
- $1 ... $9 : Argumentos pasados al programa. Si usamos las llaves "{}" para nombrar las variables el llimite se puede extender mucho más allá, pues ${11} es el undécimo argumento y no $1 y un 1.
- $0 : Nombre del programa que se está ejecutando.
- $# : Número de argumentos que se han pasado al programa.
- $* o $@ : Argumentos pasados al programa.
- $@ : Argumentos pasados al programa pero teniendo en cuenta su separación.
- $? : Valor devuelto por el último programa que se ha ejecutado.
- $! : Número de proceso del último proceso que se ejecuto en background.
- $$ : Número de proceso de la shell actual.
Veamos la diferencia entre $* y $@
$ set "1" "2" "a c" "b"
$ for i in $*
do
echo "$i"
done
1
2
a
c
b
$ for i in $@
do
echo "$i"
done
1
2
a
c
b
$ for i in "$*"
do
echo "$i"
done
1 2 a c b
$ for i in "$@"
do
echo "$i"
done
1
2
a c
b
La expansión de variables es muy útil a la hora de trabajar con las mismas en ksh, pues se pueden realizar acciones que de otro modo resultarían más engorrosas o pesadas. Solo vamos a ver las más sencillas.
- ${#VARIABLE} : Devuelve la longitud de la variable VARIABLE, su número de caracteres.
- ${#VARIABLE[*]} : Devuelve la longitud del array con nombre VARIABLE, su número de elementos.
- ${#VARIABLE:-TEXTO]} : Devuelve el contenido de VARIABLE, si está establecida y no es nula, en caso contrario devuelve el contenido de TEXTO. Resulta úil para inicializaciones.
- ${#VARIABLE:=TEXTO]} : Devuelve el contenido de VARIABLE, si está establecida y no es nula, en caso contrario asigna a VARIABLE y devuelve el contenido de TEXTO. Resulta útil para inicializaciones.
- ${#VARIABLE:?TEXTO]} : Devuelve el contenido de VARIABLE, si está establecida y no es nula, en caso contrario devuelve en la salida estándar de error el contenido de TEXTO.
- ${#VARIABLE:+TEXTO]} : Devuelve TEXTO si VARIABLE está establecida y no es nula, en caso contrario devuelve la cadena nula.
- ${VARIABLE#patron} : Devuelve el contenido de VARIABLE eliminando la subcadena más pequeña que encaje por la izquierda (principio) con patrón eliminado. Admite los comodines * y ?, y si el patrón empieza por # deberá ir entrecomillado
- ${VARIABLE##patron} : Devuelve el contenido de VARIABLE eliminando la subcadena más grande que encaje por la izquierda (principio) con patrón eliminado.
- ${VARIABLE%patron} : Devuelve el contenido de VARIABLE eliminando la subcadena más pequeña que encaje por la derecha (final) con patrón eliminado. Si el patrón comienza por % deberá ir entrecomillado.
- ${VARIABLE%%patron} : Devuelve el contenido de VARIABLE eliminando la subcadena más grande que encaje por la derecha (final) con patrón eliminado.
- ${VARIABLE:inicio:longitud} : Devuelve la subcadena de VARIABLE, de tamaño longitud, comenzando en inicio. Si no se indica longitud, o es demasiado grande se devuelve desde inicio hasta el final. El primer carácter de VARIABLE se corresponde con la posición 0. (a partir de la versión 88 de ksh).
Ejemplos:
$ PP="/usuarios/externos/tu/subdirectorio"
$ print ${PP:-Hola}
/usuarios/externos/tu/subdirectorio
$ print ${PPP:-Hola}
Hola
$ print ${PP:=Hola}
/usuarios/externos/tu/subdirectorio
$ PP=''
$ print ${PP:=Hola}
Hola
$ echo ${PP}
Hola
$ print ${PPPP:?Hola}
ksh: PPPP: Hola
$ print ${PPPP:+Hola}
$ print ${PP:+Hola}
Hola
$ PP="/usuarios/externos/tu/subdirectorio"
$ print "${PP#*/}"
usuarios/externos/tu/subdirectorio
$ print "${PP##*/}"
subdirectorio
$ print "${PP%/*}"
/usuarios/externos/tu
$ print "${PP%%/*}"
$ print "${PP%%*/}"
/usuarios/externos/tu/subdirectorio
$ print "${PP%%*/*}"
Es recomendable, como ya he comentado antes, encerrar el nombre de las variables entre llaves "{}", aunque no obligatorio, para evitar problemas con variables de nombres similares.