18.12.07

Vectores en Korn Shell (Unix)

Aquellos que utilizan Unix o Linux diariamente, programan muchos scripts para diversas tareas. Es que uno de sus kernels ksh es de los más cómodos para trabajar. Pero pocos dan utilidad a los vectores (arrays).

Su utilización es sencilla, simplemente se asigna a una variable con subíndice un valor y listo. Los subíndices pueden no ser consecutivos, lo que muchas veces puede complicar las cosas a la hora de querer iterarlos, no por el vector, sino por las tareas que hagas con los contenidos de los elementos vacios. Tal vez convenga utilizar una variable para ir llevando el contador de elementos.

myVar[0]="algo"
myVar[1]="algo mas"
myVar[3]="otra cosa"

#-- otra forma (pero asina subindices consecutivos)
set -A myVar "algo" "algo mas" "otra cosa"

Pero ¿cómo los recorremos? Uno de los datos principales que necesitamos para recorrerlos es el subíndice máximo del vector, y algo que pocos conoces es la sentencia para obtener ese valor: ${#myVar[@]}, que devuelve el subíndice máximo que se utilizó para asignar un elemento al vector, no la cantidad de elementos que componen el mismo. En el ejemplo anterior, la sentencia retornará 3 para la primera parte del ejemplo y 2 para la segunda parte (set -A...) ya que los subíndices comienzan por cero.

Así, la forma de recorrer el vector sería:

i=0
while [ i -le ${#myVar[@]} ]
do
        var=${myVar[i]}
        ...
done

Nótese en el ejemplo que las llaves ({}) rodean al elemento solicitado. Esta es la forma de acceder a un dato guardado en un elemento requerido del vector.

De esta forma nos aseguramos de recorrer el vector hasta su último elemento aunque alguno de sus subíndice no haya sido asignado. Pero ¿cómo sabemos cuantos elementos fueron asignados?. La respuesta está en esta simple instrucción:

#-- retorna el numer de elementos asignados
echo ${#myVar[*]}

Por otra parte, si quisieramos ver todos los elementos del vector en una lista vastará con:

echo ${myVar[*]}

# MUESTRA  algo algo mas otra cosa

lo que no es muy útil si tenemos en cuenta que el separador de campos por omisión que utiliza Unix es el espacio en blanco, con lo cual perderíamos la capacidad de saber donde comienza y donde termina cada elemento. Esto tiene una fácil solución cambiando el valor del separador de campo que se encuentra en la variable de entorno FS.

Confronte.com

4 Comentarios:

Anónimo dice...

Hola !

Soy Matías de Confronte.com, muy bueno tu artículo sobre Korn shell! En que sistema operativo lo estás usando? Por qué utilizás Korn?

Yo usé Kornshell en AIX, porque no había versiones, en ese momento de BASH. Me gustaría saber si usas Korn porque te gusta más de bASH o porque no tenés opción :-). Gracias!!
matías

Julio González Seara dice...

No tengo otra opción. Es el que usa la empresa donde trabajo.

tunez dice...

muy buenas tus directrices. saludos

Anónimo dice...

Hola, oye tengo un problema, yo estoy utilizando Ubuntu y al momento que pongo la sintaxis para imprimir todo el vector, marca de color diferente la ultima llave, cuando lo ejecuto en la terminal marca en la asignacion del vector not found, y en la impresion me dice: Bad substitution.

Qué podrá ser??

Espero tu respuesta pronto, ya que mis examenes tratan de este tema y no los puedo ejecutar por estas razones.

De antemano gracias