Korn Shell: bibliografía
• “The Korn Shell. User & Programming Manual”, Anatole
LENGUAJES DE CONTROL DE ÓRDENES Olczak, Addison-Wesley Publishing Company, 1992
KORN SHELL
CONTENIDOS:
1. Introducción
2. Aspectos básicos
3. Variables y parámetros
4. Control de tareas
5. El entorno
6. Operaciones aritméticas
7. Escritura de programas
KSH: Introducción KSH: Introducción
• El Korn Shell (ksh) es un lenguaje de control y programación de tareas • Inicio de sesión. cuando un usuario entra en el sistema se le ejecuta el
interactivo para entornos UNIX que: intérprete de órdenes que tiene declarado en el fichero /etc/passwd,
– Presenta un mejor rendimiento que los lenguajes tradicionales de control y por ejemplo:
programación de órdenes. – lara:IWed4QkoRZ1d:101:12::/home/lara:/bin/ksh
– Compatible con otros lenguajes de control y programación de órdenes, por
ejemplo el Bourne shell (bsh). • Cambio de intérprete de órdenes. Simplemente tecleando el nombre,
– Soporta mayores facilidades de operaciones de Entrada/Salida. por ejemplo:
– Soporta tipos de datos y atributos. – $ ksh
– Soporta vectores unidimensionales.
– Soporta aritmética entera. • Retorno al intérprete de órdenes original. Simplemente tecleando lo
– Proporciona facilidades para el manejo de cadenas de caracteres. siguiente
– Soporta facilidades para el control de tareas. – $ Ctl-d
– Soporta funciones y “alias”
– Etc.
KSH: Introducción KSH: Conceptos básicos
• Invocación separada de varios intérpretes de órdenes. Cada • Orden. Se trata de una cadena de caracteres, organizada en palabras,
intérprete posee un conjunto de variables de entorno que se definen en el que el carácter blanco se utiliza como separador entre palabras y
para cada usuario. Estas se pueden almacenar en ficheros específicos: en el que la primera palabra se interpreta como el nombre de un fichero
– Korn Shell (ksh ): .kshrc ejecutable que contiene un programa.
– Bourne Shell (bsh): .profile – $ echo HOLA
– C Shell (kshrc): .login
• Continuación de orden. Si una orden termina con el carácter “\”,
entonces la siguiente línea se interpreta como una continuación de la
anterior.
– $ echo HOLA \
– > JUAN
• Múltiples órdenes. En una misma línea se pueden especificar varias
órdenes empleando el carácter “;”.
– $ echo HOLA; echo JUAN; echo MARIA
1
KSH: Conceptos básicos KSH: Conceptos básicos
• Retorno. Cuando una orden (programa) se ejecuta ésta devuelve un
• Ejecución de órdenes en segundo plano. Toda orden que finalice con
valor entero, el valor 0 se suele interpretar como ejecución con éxito,
el carácter “&” el KSH la ejecutará, pero no esperará por su
un valor distinto de cero se suele interpretar como ejecución con error.
finalización, por tanto, mientras ésta se ejecuta se podrá ordenar la
ejecución de otra.
– $ ls /usr & • Ejecución condicional. Si dos órdenes están separadas por “&&”, si la
primera devuelve el valor 0 entonces la segunda se ejecuta.
– $ ls temp && echo temp existe
• Tuberías (pipes). Se trata de un mecanismo que permite la
comunicación entre órdenes, de forma que la salidas que unas
producen son las entradas de otras. Para establecer una tubería de • Ejecución condicional. Si dos órdenes están separadas por “||”, si la
comunicación entre órdenes se ha de especificar el carácter “|”. primera devuelve el valor distinto de 0 entonces la segunda se ejecuta.
– $ ls | wc -l – $ ls temp || echo temp no existe
– $ ls temp && echo temp existe || echo temp no\
>existe
KSH: Conceptos básicos KSH: Conceptos básicos
• Agrupación de órdenes. las órdenes encerrados con “{}” se ejecutan • Redirección de entrada y salida. Mediante los símbolos “>” y “>>”
combinando sus salidas. Para que la construcción sea correcta debe podemos redirigir el flujo de salida de una orden.
haber un espacio en blanco después del símbolo “{“ y antes del – $ echo Hola > prueba
símbolo “}”. las órdenes deberán ir separados por “;” y el último dela – $ echo Hola >> prueba
línea deberá ir terminado también por “;”. – $ > tmp
– $ { echo El contenido de temp: ; cat temp ; } | nl
KSH: Conceptos básicos KSH: Conceptos básicos
• La opción “noclobber”. Podemos prevenir la escritura de ficheros • Redirección de entrada y salida. Mediante el símbolo “<” podemos
mediante redireccionamientos mediante esta opción. redirigir el canal de entrada de una orden.
– $ set -o noclobber – $ mail Juan Maria < mensaje
– $ set +o noclobber
• Cierre de los canales de entrada y salida. Mediante los operadores
“<&-” y “>&-” podemos cerrar los canales de entrada y salida
• El operador “>|”. Podemos forzar la escritura en un fichero incluso
respectivamente de una orden.
estando activa la opción “noclobber”
– $ cat temp | wc -l <&-
– $ ls >| temp
2
KSH: Conceptos básicos KSH: Conceptos básicos
• Descriptores de ficheros.
• Redirección de cualquier canal. Con el operador “>&n” podemos
– 0 Canal de entrada estándar redireccionar la salida de una orden al archivo especificado por el
– 1 Canal de salida estándar descriptor n, por tanto “n” debe ser un descriptor de archivo válido.
– 2 Canal de error estándar – $ echo Este mensaje va al canal de error >&2
– 3-9 Descriptores disponibles – $ ls tmp [Link] >&2 2>ls.salida_error
– $ { echo Esto va al canal de salida >&1 ; \
– echo Esto va al canal de error >&2 ; }
• Redirección de cualquier canal. Con el operador “n>” podemos
redireccionar el canal n a un archivo, siendo “n” un descriptor de – $ { echo Esto va al canal de salida >&1 ; \
archivo válido. – echo Esto va al canal de error >&2 ; } > salida
– $ ls tmp [Link] 2> ls.salida_error
KSH: Conceptos básicos KSH: Conceptos básicos
• Metacaracteres. Mediante estos caracteres especiales podemos formar
• Redirección de canales. Con el operador “n>&m”produce una salida
listas de nombres de archivos que encajen con un patrón determinado:
donde los contenidos de los archivos referenciados por los descriptores
n y m están anexados, por tanto “n” y “m”deben ser descriptores de – “*” Cero o cualquier cadena de 1 o más caracteres
archivos válidos. – “?” Cualquier carácter
– $ { echo Esto va al canal de salida >&1 ; \ – “[]” Cualquier carácter o rango de caracteres especificado
– echo Esto va al canal de error >&2 ; } >sal 2>&1 – “!” Se usa con “[]” y significa negación, o sea, que no coincida
con el carácter o rango de caracteres especificado.
– “.” El punto inicial se emplea para los archivos ocultos y por ello
debe se especificado explícitamente.
KSH: Conceptos básicos KSH: Conceptos básicos
• Ejemplos de uso de metacaracteres. • Operadores de patrones complejos. El KSH permite buscar patrones
– $ ls *ab* formados por cadenas de caracteres:
– $ ls ?? – ?(patrón) Cero o una ocurrencia de patrón.
– $ ls ???* – *(patrón) Cero, una o más ocurrencias de patrón
– $ ls [am]*[1-9] – +(patrón) Una o más ocurrencias de patrón
– $ ls [!a]*
– @(patrón) Una ocurrencia de patrón
– $ ls .[a-h]
– !(patrón) Cualquier excepto en las que aparezca patrón
– $ rm *.[!ab]
• Lista de patrones. Se pueden especificar múltiples patrones utilizando
el carácter “|” como separador.
3
KSH: Conceptos básicos KSH: Conceptos básicos
• Ejemplos de uso de operadores con patrones complejos. • Ejecución de órdenes. Mediante la expresión $(orden) nos referimos
– *(A|i) a la salida producida por la ejecución de la orden:
– s?(?|??) – $ echo La fecha de hoy es $(date)
– 1?([0-9]) – echo $(who -q) están en sesión
– m+(iss)* – echo Hay $(who | wc -l) usarios en sesión
– @([AC]la)*
• Operaciones aritméticas. Mediante la expresión
• Desactivando el uso de metacaracteres o de opradores de patrones. $((expresion_aritmética)) podemos referirnos al resultado de la
operación.
– $ set -o noglob
– $ echo $((8-3))
– $ set -f
KSH: Conceptos básicos KSH: variables y parámetros
• El operador “ ~”. Con este operador se referencia atributos de • Variable. Un variable se define cuando se declara o cuando se le
asigna un valor. Los nombres de variables deben empezar por un
entorno referidos a rutas de archivos:
carácter alfabético (a-Z) al que le puede seguir cualquier carácter
– “~” sinónimo del contenido de la variable HOME
alfanumérico (a-Z,0-9). Existen variables cuyos nombres están
– “~user” sinónimo del contenido de la variable HOME del usuario user compuesto por sólo número o caracteres especiales (!,@,#,%,*,?,$)
– “~-” sinónimo del contenido de la variable OLDPWD que son de uso interno del KSH.
– “~+” sinónimo del contenido de la variable PWD – $ X
– $ typeset B
– $ Z=abc
– $typset K1 = hola
• Acceso al valor de la variable. Mediante el operador “$”
– $ echo $Z
– $ cd $HOME
KSH: variables y parámetros KSH: variables y parámetros
• Atributos de variables. Mediante la palabra clave “typeset” podemos • Desactivación de atributos. Todos los atributos de una variable
establecer valores y/o atributos a las variables. pueden ser desactivados, excepto el atributo de sólo lectura.
– typeset -atributo variable = valor – typeset +atributo variable
– typeset -atributo variable
• Múltiples atributos. Podemos establecer varios atributos de una
variable mediante una sola línea de órdenes:
• Atributos soportados por el KSH.
– $ typeset -ix TMOUT = 300
– typeset -i var - typeset -t var
– typeset -l var - typeset -u var
• Comprobación de los atributos de las variables. Podemos listar
– typeset -L var - typeset -x var conocer qué variables poseen un determinado atributo
– typeset -LZn var - typeset -Z var – typeset -atributo
– typeset -r var – typeset +atributo
– typeset -R var
– typset -RZn var
4
KSH: variables y parámetros KSH: variables y parámetros
• Asignación de valores a variables. Ésta se puede realizar de distintas • Parámetros especiales. El KSH hace uso de algunos parámetros de
formas forma automática
– variable = literal $ X = HOME – ? Código de salida de la última orden ejecutada
– variable1 = $variable2 $ X = $HOME – $ Identificador de proceso del intérprete actual
– variable1 = $(orden) $ X = $(echo $HOME) – ERRNO Código de error de la última llamada al sistema
– variable1 = ‘orden’ $ X = ‘echo $HOME)
– variable1 = $(<archivo) $ X = $(<prueba) • Ejemplos:
– $ print $?
• Eliminación de variables. Podemos eliminar definiciones de variables – $ print $$
mediante la opción unset . Eliminar una opción no es lo mismo que – $ cat [Link]
asignar el valor nulo al contenido de una variable – [Link]: No such file or directory
– unset variable – $ print $ERRNO
KSH: variables y parámetros KSH: variables y parámetros
• Expansión de variables. El KSH soporta el acceso y modificación del • Vectores de variables. El KSH soporta vectores de dimensión
contenido de las variables mediante un conjunto de operadores máxima de 512 elementos. Los índices de un vector empiezan en 0 y
– $variable $ CA=hola; CA=$CAlifornia acaban en su dimensión menos uno.
– ${variable} $ CA=${CA}lifornia – variable[0]=valor0 variable[1]=valor1 .... variable[n]=valorn
– ${#variable} $ print ${#CA} – set -A variable valor0 valor1 ... Valorn
– ${variable:-literal} $ ${CA:-ab} – typeset variable[0]=valor0 variable[1]=valor1 .... variable[n]=valorn
– ${variable:=literal} $ ${CA:=ab}
– ${variable:+literal} $ ${CA:+hola} • Acceso y modificación al contenido de vectores.
– ${variable:?} $ ${CA:?} – ${vector}, $vector
– ${variable:?literal} $ ${CA:?hola} – ${vector[n]}
– ${variable#patrón} $ ${CA#ho} – ${vector[*]}, ${vector[@]}
– ${variable##patron} $ ${CA##la} – ${#vector[*]}, ${#vector[@]}
– ${variable%patrón} $ ${CA%ho} – ${#vector[n]}
– ${variable%%patrón} $ $(CA%%la}
KSH: variables y parámetros KSH: variables y parámetros
• Atributos. Cómo las variables ordinarias, el KSH permite establecer • Las comillas simples. Se utiliza para obviar el significado especial de
atributos de vectores y éstos son los mismos que los definidos para las los caracteres especiales ($,*,?,\,”,etc.) y realizar asignaciones que
variables ordinarias. Los atributos se aplican a todos los elementos del contienen espacios en blanco $ CA = ‘hola Juan’
vector. – $ echo ‘$HOME’
– typeset -atributo variable[0]=valor0 .... variable[n]=valorn
– typeset -atributo vector • Dobles comillas. Igual que la comillas simples, excepto que no anulan
el significado de los caracteres especiales: $, ` y \.
• Reasignación. Mediante la misma sintaxis de definición y asignación – $ CA=“$HOME:`pwd`”
de valores a vectores podemos reasignar los contenidos de los
elementos de un vector. Además el KSH permite modificar el • La Comillas: ``. Se utilizan para asignar la salida producida por la
contenido de sólo algunos elementos de un vector ejecución de una orden
– set +A variable valo0 valor1 ... – $ CA=`date`
5
KSH: control de tareas KSH: control de tareas
• Control de tareas. El KSH posee un conjunto de facilidades que
• Órdenes para el control de tareas.
permiten el control de la ejecución de las tareas, para ello es necesario
que esté activada la opción “monitor” – Ctl-z Detener la tarea actual
– $ set -o monitor – jobs Visualiza el estado de todas las tareas
– $ set -m – jobs %n Visualiza el estado de la tarea n
– jobs -p Visualiza los identificadores de proceso de todas las
tareas.
• ¿Cómo saber si la opción monitor está activa?
– bg Pasa a segundo plano la tarea actual detenida
– $ set -o | grep monitor
– bg %n Pasa a segundo plano la tarea n detenida
– fg Pasa a modo interactivo la tarea actual que está en
segundo plano
– fg %n Pasa a modo interactivo la tarea n que está en
segundo plano
KSH: control de tareas KSH: control de tareas
• Órdenes para el control de tareas. • Formas de nombrar a las tareas. Existen varías formas de referirnos
– Kill %n Finaliza la tarea n a una tarea
– kill -l Visualiza los nombres de señales válidas – %n Tarea n
– kill -signal %n Envía la señal especificada a la tarea n – %+ , %% Tarea actual
– stty tostop Anula la salidas de las tareas en segundo plano – %- Tarea previa
– stty -tostop Permite que las salidas de las tareas de segundo – %cadena Tarea cuyo nombre empieza por cadena
plano – %? Tarea cuyo nombre contiene a cadena
– wait Espera por la finalización de la tarea actual en
segundo plano – Ejemplo:
– wait %n Espera por la finalización de la tarea n en – $ jobs -l
segundo plano – [3] + 466 Stopped split -5000 hugefile
– Entonces formas de nombrar a la tarea split: %3, %+,%%, 466,
%split, %?spl
KSH: operaciones aritméticas KSH: operaciones aritméticas
• Especificación de operaciones aritméticas. Cualquier operación de • Formato de constantes numéricas.
las soportadas por el KSH puede realizarse utilizando las siguientes
– número
sintaxis alternativas:
– base#número
– let “operación-aritmética”
– (( operación_aritmética))
– Ejemplos:
– $ typeset -i2 X=5
– Ejemplos: las siguientes expresiones son equivalentes
– $ typeset -i X=2#101
• $ let “X=X+1”
• $ ((X=X+1)
– Declaración de variables enteras. Mediante la cláusula typset
podemos definir variables enteras
– typeset -i variable=valor-numérico
6
KSH: operaciones aritméticas
KSH: operaciones aritméticas
• Operadores aritméticos (por orden de precedencia).
• Operadores aritméticos (por orden de precedencia).
– - Evalúa el valor negativo de una expresión
– && Operador relacional AND
– ! Negación lógica
– || Operador relacional OR
– ~ Negación binaria
– = Asignación
– *, /, % Multiplicación, divisón, resto
– *=, /=, %= multiplación y asignación, división y
– +,- Suma, resta
asignación, resto y asignación
– <<, >> Desplazamiento a la izq., desplazamiento a la derch.
– +=, -= Suma y asignación, resta y asignación
– <=, < Menor que, menor que
– <<=, >>= Desplazamiento izq. Y asignación,
– >=, < Mayor o igual que, mayor que desplazamiento derecha y asignación
– == Igual que – &=, ^=, |= And binario y asignación, OR-exclusivo y
– != Distinto que asignación, OR binario y asignación
– & And binario – (...) Especificación de operación y precedencia
– ^ OR_exclusivo
– | OR binario
KSH: el ambiente KSH: el ambiente
• Establecimiento de las variables de ambiente. Cuando se invoca al • Opciones de ambiente. El KSH permite variar ciertas formas de su
KSH, éste con el objeto de establecer el ambiente del usuario que le ha funcionamiento, para ello debemos utilizar la orden set. Por ejemplo:
invocado accede a los siguientes archivos:
– set -a, set -o allexport
– /etc/.profile
– set -o bgnice
– $HOME/.profile
– set -o emacs, set -o gmacs
– set -m, set -o monitor
• Algunas variables de ambiente:
– set -n, set -o noexec
– CDPATH IFS TMOUT
– set -o noclobber
– COLUMNS MAIL VISUAL
– set -f, set -o noglob
– EDITOR MAILCHECK
– set -o vi
– ENV PATH
– set -x, set -o xtrace
– HISTFILE PS1, ..., PS4
– HISTSIZE SHELL
– HOME TERM
KSH: el ambiente
KSH: el ambiente
• Alias. Se trata de una facilidad soportada por el KSH mediante la cual
podemos definir nuevos nombres de órdenes. Para usar esta facilidad • Subshells. Se trata de procesos hijos del intérprete actual y que
disponemos de las siguientes órdenes: ejecutan a otro intérprete de órdenes. Éstos heredan las variables de
– alias nuevo_nombre=orden entorno del intérprete padre y una vez finalizada su ejecución, las
– alias variable cosnervan el valor que tenían en el momento de la creación
– unalias nuevo_nombre del subshell. Para generar un subshell se ha de utilizar la siguiente
sintaxis:
– ( orden )
• Ejemplos:
– $ alias p=printf
• Ejemplo:
– $ p Hola
• $ PRUEBA=Hola
– Hola
• $ (printf $PRUEBA)
– $ unalias p
• $ (PRUEBA=Adios; printf $PRUEBA )
– $ p Hola
• $ printf PRUEBA
7
KSH: escritura de programas KSH: escritura de programas
• Programas escritos en KSH. El KSH puede ejecutar archivos • La orden [[...]] Con ésta podemos evaluar expresiones condicionales e
(“scripts”) que contienen un conjunto de órdenes. El archivo ha de utilizar el resultado de dicha evaluación. Su sintaxis es:
tener permiso de ejecución. – [[ expresión_condicional ]]
– $ echo echo Mi primer programa > programa
– $ chmod 0755 programa
– La orden [[...]] para operar con cadenas de caracteres.
– $ programa
• [[ -n cadena ]] [[ cadena1 < cadena2 ]]
– $ ksh programa
• [[ -o opcion ]] [[ cadena1 > cadena2 ]]
• [[ -z cadena ]] [[ cadena1 = patron ]]
• Parámetros posicionales. Son variables que se crean automáticamente • [[ cadena1 = cadena2 ]] [[ cadena1 != patron ]]
y que contienen las distintas subcadenas que componen una orden.
• [[ cadena1 != cadena2 ]]
– $ ptest HOLA JUAN
• En este ejemplo, $0 es “ptest”, $1 es HOLA y $2 es JUAN
– La orden [[...]] para operar con enteros.
• Estas variables no admiten sentencias que impliquen la modificación
de sus contenidos. La única manera de modificarlos es mediante la – [[ expr1 -eq expr2 ]] [[ expr1 -lt expr2 ]]
sentencia shift. – [[ expr1 -ne expr2 ]] [[ expr1 -ge expr2 ]]
– [[ expr1 -lq expr2 ]] [[ expr1 -gt expr2 ]]
KSH: escritura de programas
KSH: escritura de programas
• La orden [[...]] para operar con cadenas de caracteres.
• [[ -a fich ]] [[ -S fich ]] • Sentencia “case”.
• [[ -d dir ]] [[ -u fich ]] – case valor in
• [[ -f fich ]] [[ -w fich ]] • patron1) orden
• [[ -L fich ]] [[ -x fich ]] • orden;;
• [[ -O fich ]] [[ fich1 -ef fich2 ]] • patron2) orden
• [[ -G fich ]] [[ fich1 -nt fich2 ]]
• orden;;
• [[ -r fich ]] [[ fich1 -ot fich2 ]]
• .....
• [[ -s fich ]]
• patronN) orden
• Expresiones complejas con la orden [[...]] • orden;;
– [[ expr1 && expr2 ]] – esac
– [[ expr1 || expr2 ]]
– [[ !expr ]]
– [[ (expr) ]]
KSH: escritura de programas KSH: escritura de programas
• Ejemplo de sentencia case. • Sentencia “for”.
– case $1 in – for variable in palabra1 palabra2 .... palabraN
• -@([a-z])) echo carácter minuscula;; – do
• -@([A-Z])) echo carácter mayuscula;; • orden
– done
• @([1-9])([0-9])) echo numero entero
– esac
• Variante:
– for variable
– do
• orden
– done
8
KSH: escritura de programas
KSH: escritura de programas
• Sentencia “if”.
• Ejemplo de sentencia “for”
– if orden1
• integer ITERACION=0
– then
• for X in A B C D
• orden
• do
– else
– printf “$ITERACION $X”
• orden
– ((ITERACION+=1))
– fi
• done
• USERS=$(who | wc l)
• if ((USERS == 1))
• then
– echo Hay 1 usuario
• else
– echo hay mas de 1 usuario
• fi
KSH: escritura de programas KSH: escritura de programas
• Sentencia “elif”. • Ejemplo elif
– if orden1 • USERS=$(who | wc l)
– then • if ((USERS == 1))
• orden • then
– elif orden2 – echo Hay 1 usuario
– then • elif ((USERS == 2))
• orden • then
– elif orden3 – echo hay 2 usuarios
– then • else
• orden – echo hay 3 o mas usuarios
– else • fi
• orden
– fi
KSH: escritura de programas KSH: escritura de programas
• Sentecia “while”. • Sentecia “until”.
– while orden1 – until orden1
– do – do
• órdenes • órdenes
– done – done
• Ejemplo • Ejemplo
– while (($# != 0)) – until (($# == 0))
– do – do
• printf $1 • printf $1
• shift • shift
– done – done
9
KSH: escritura de programas
KSH: escritura de programas
• Sentencia “continue”. Con esta sentencia forzamos la finalización de
• Sentecia “select”. la iteración actual en bucles for, while y until.
– select variable in palabra1 palabra2 palabra3 ... palabran
– do – while (($# != 0 ))
• órdenes – do
– done • if [[ $1 = +([A-z]) ]]
• then
• Ejemplo – printf “$1: argumento invalido”
– select i in op1 op2 op3 – shift
– do • else
• if [[ $i = op[1-3] ]] – printf “$1: argumento invalido”
• then – shift
• printf”Ha seleccionado $REPLY: $i” – continue
• fi • fi
– done – done
KSH: escritura de programas
• Sentecia “break”. Con esta sentencia forzamos la salida de un bucle
for, while, until. Admite dos formas
– break
– break n
– for i in 1 2 3
– do
• for j in 5 6
• do
– if (( i == 3 && j == 5 ))
– then
» break 2
– else
» printf “$i$j
– fi
• done
– done
10