Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Teoria
Teoria
2
1.10.2. Comandos relacionados con la fecha del sistema. ................................................................. 16
1.10.2.1. Comando date. ................................................................................................................. 16
1.10.2.2. Comando cal. ................................................................................................................... 17
1.10.2.3. Comando calendar. .......................................................................................................... 17
1.10.3. Comandos para la visualización de ficheros. ......................................................................... 17
1.10.3.1. Comando pg. .................................................................................................................... 17
1.10.3.2. Comando more. ............................................................................................................... 18
1.10.3.3. Comando hexdump. ......................................................................................................... 18
1.10.3.4. Comando bpe. .................................................................................................................. 18
1.10.4. Comandos de comparación de ficheros. ................................................................................. 18
1.10.4.1. Comando cmp. ................................................................................................................. 18
1.10.4.2. Comando comm. .............................................................................................................. 18
1.10.4.3. Comando diff. .................................................................................................................. 18
1.10.4.4. Comando uniq.................................................................................................................. 18
1.10.5. Operaciones sobre ficheros de texto. ...................................................................................... 19
1.10.5.1. Comando sort. .................................................................................................................. 19
1.10.5.2. Comando cut. ................................................................................................................... 19
1.10.5.3. Comando paste. ............................................................................................................... 19
1.10.5.4. Comando join. ................................................................................................................. 19
1.10.5.5. Otros comandos. .............................................................................................................. 20
1.10.6. Localización de ficheros. ........................................................................................................ 20
1.10.6.1. Comando find. ................................................................................................................. 20
1.10.6.2. Comando grep.................................................................................................................. 21
1.10.6.3. Comando sed. .................................................................................................................. 22
1.11. EL SHELL ...................................................................................................................................... 24
1.11.1. Redireccionamientos y pipes. ................................................................................................. 24
1.11.2. Variables del Shell. ................................................................................................................. 25
1.11.3. Variables de entorno. ............................................................................................................. 26
1.11.4. Fichero .profile. ...................................................................................................................... 26
1.11.5. Órdenes internas del shell. ..................................................................................................... 27
1.11.6. La orden eval y el operador grave. ........................................................................................ 27
1.12. IMPLEMENTACIÓN DE SHELL-SCRIPTS. ........................................................................................ 28
1.12.1. Construcción if-then-else. ....................................................................................................... 28
1.12.2. La orden test. .......................................................................................................................... 28
1.12.3. Construcciones de control iterativas ...................................................................................... 29
1.12.3.2. Construcción while o until. .............................................................................................. 29
1.12.3.3. Comando expr.................................................................................................................. 30
1.12.4. Sentencias read, exit y break. ................................................................................................ 30
1.12.5. Sentencia case ........................................................................................................................ 31
1.12.6. Declaración de funciones. ...................................................................................................... 31
3
1. USO DEL SISTEMA UNIX.
4
1.3. Componentes principales del sistema.
1. KERNEL
2. Shell
3. Utilidades.- conjunto de aplicaciones que normalmente suele suministrar UNIX para facilitar
todo tipo de tareas.
KERNEL
Es el corazón del Sistema UNIX. Es la porción del Sistema Operativo que trabaja más cerrada e
independientemente del usuario. Es el manejador del Sistema UNIX. Se encarga de realizar las funciones
de más bajo nivel con respecto al hardware del sistema, permitiendo por lo tanto, la no dependencia del
hardware del resto de las partes del Sistema Operativo. La utilidades de UNIX, así como las aplicaciones
de los usuarios, lo utilizan para que realice por ellas los servicios de interfaces necesarios con el hardware
(status, etc). Reside permanentemente en la memoria. El kernel maneja los procesos y los recursos del
siguiente modo:
Shell
El Shell es realmente la única parte del Sistema UNIX que el usuario ve. Actúa como un
intérprete, permitiéndole comunicarse con el Sistema Operativo UNIX. Cuando los usuarios introducen
un comando, el Shell, que es un programa que está en constante ejecución, lo analiza y llama a ejecución
al programa que realiza la función especificada por el comando. Cada usuario que trabaja en el Sistema
UNIX tiene su propio programa Shell o "entorno". Hay más de un tipo de prompt, dependiendo del
SHELL: Bourne, Berkeley, Creados por los usuarios, Super User.
Un usuario puede utilizar diferentes SHELLS al mismo tiempo. También actúa como un
lenguaje de programación: ya que se combina mediante estructuras de control grupos de comandos
almacenados en archivos llamados SHELLSCRIPTS pudiendo así crear aplicaciones que pueden realizar
tareas complicadas.
Dada la característica multiusuario del sistema UNIX y por motivo de seguridad, el acceso al
mismo está restringido.
Sólo tendrán acceso al sistema aquellos usuarios a los que el administrador haya asignado
previamente un identificativo (ID). El identificativo de usuario, asignado por el administrador, puede
tener longitud variable, pero tan sólo serán significativos los primeros ocho caracteres. No están
permitidos los espacios.
Para incrementar la seguridad, cada usuario puede añadir opcionalmente una contraseña de
acceso al sistema. La existencia de contraseña puede ser impuesta por el administrador.
Cuando se va a trabajar desde un terminal conectado directamente al ordenador, nada más
encenderlo aparecerá un mensaje solicitando la identificación del usuario. Este mensaje puede ser
modificado por el administrador.
login:
En este momento el usuario puede introducir el identificativo que se le haya asignado y pulsar
Intro. Es importante que el identificativo sea introducido en minúsculas, pues en caso contrario el sistema
asume que el terminal sólo dispone de mayúsculas y mantendrá la comunicación de esta forma durante
toda la sesión de trabajo. Esto puede traer complicaciones, pues el sistema UNIX diferencia mayúsculas
de minúsculas.
5
En el caso de que el usuario tuviera contraseña de acceso al sistema, le será solicitada a
continuación por medio de la palabra “passwd”. Para mayor seguridad, la contraseña tecleada por el
usuario no aparece jamás en la pantalla. Cualquier equivocación al teclear el identificativo hará que el
sistema solicite una contraseña y una vez tecleada ésta, contestará con “login incorrect” y volverá a pedir
el identificativo. Tan sólo cuando el identificativo de usuario y la contraseña de acceso se han introducido
correctamente, aparecerán en pantalla una serie de mensajes y el sistema quedará preparado para recibir
las órdenes del usuario.
Siempre que el sistema esté en espera para recibir órdenes, aparecerá en la pantalla un mensaje
indicativo o prompt.
Para finalizar la sesión de trabajo basta mantener pulsada la tecla control-d, o teclear exit +
Intro. Una vez finalizada la sesión, el sistema vuelve a mostrar los mensajes con los que solicita el
identificativo de usuario. En este momento se podrá apagar el terminal.
1.5. Contraseña.
La contraseña puede ser modificada siempre que se desee. Tiene las siguientes características:
- Cada contraseña deberá tener al menos seis caracteres, pero es configurable.
- Son significativos los ocho primeros caracteres.
- Deberá tener al menos dos caracteres alfabéticos y al menos un carácter numérico o carácter
especial. Cada contraseña deberá diferir del login del usuario en tres caracteres.
- Las nuevas contraseñas deberán diferir de las anteriores al menos en tres caracteres.
- Puede tener limitado su tiempo de efectividad.
- Directorio raíz: en muchos sistemas Unix es el directorio HOME del superusuario. Contiene
un fichero muy importante para el arranque del sistema, el unix (depende del sistema el
nombre del fichero: dgux, xenix, vmlinux, etc), que es el núcleo del sistema operativo. Por
lo demás, habitualmente no habrá más que entradas de directorios en la raíz.
- Directorio “usr”: es el directorio de los usuarios. De él cuelgan normalmente los
subdirectorios de los diferentes usuarios del sistema. Además contiene otros subdirectorios
(bin, sbin, doc, include, lib, man, tmp, spool) , que esencialmente tienen por objeto
proporcionar herramientas para la programación.
- Directorio “bin”: Contiene algunas órdenes de uso habitual por los usuarios del sistema.
- Directorio “sbin”: Contiene algunos programas relacionados con la administración del
sistema, y que por tanto, están reservados al superusuario.
- Directorio “dev”: Contiene un conjunto de ficheros especiales destinados a la gestión de
periféricos (console, hda, fd0, lp0, tty,...).
- Directorio “etc”: Contiene ficheros y herramientas empleados para la administración del
sistema. Contiene un subdirectorio default en el que se almacenan los valores por defecto de
algunas variables del sistema, así como un subdirectorio “rc.d”, en el que se encuentran los
ficheros de comando (shell-scripts) que serán ejecutados según el nivel de inicialización
elegido.
- Directorio “tmp”: Al igual que /usr/tmp es otro directorio de uso temporal.
- Directorio “var”: Complementa al directorio usr. De hecho, muchos subdirectorios de usr en
realidad son ligaduras a directorios de var, e.d., están físicamente ubicados como
subdirectorios de var, aunque también pueden accederse a través de usr.
6
- Directorio “mnt”: Habitualmente todos los sistemas Unix disponen de este directorio, que se
emplea para montar sobre él otros sistemas de ficheros. Por ello este directorio estará
generalmente vacío.
El formato de los comandos shell es una secuencia de palabras, cada palabra se separa de la
siguiente por uno o más espacios. En este contexto, una palabra es una serie de caracteres contiguos no
blancos. El comando es terminado con el carácter Nueva Línea (\n), el cual se introduce cuando se pulsa
Intro.
La primera palabra es el comando, las restantes palabras son argumentos del comando. Los
espacios son usados como separadores entre argumentos. Si por alguna razón fuera necesario incluir un
espacio en algún argumento, entonces todo el argumento deberá ser encerrado entre doble comillas (“), o
bien entre comillas simples (‘).
Comando Opciones Argumentos
cp –R ./etc /mnt
Opciones.- es un literal, que usualmente va precedido por el signo menos. Las opciones
modifican la acción de un comando, o indican cómo operar el comando. El efecto de las opciones varía
con cada comando.
Argumentos.- En ciertos comandos del primer argumento suele ser una serie de caracteres que
son utilizados como entrada a un comando, en otros muchos comandos suelen ser nombres de archivos o
directorios que van a ser utilizados.
man comando, es el equivalente a help comando en msdos.
1.8. Formato de los comandos Shell.
Los comandos shell constan de una sola palabra que se introduce a continuación del prompt
shell, seguida de un <CR> o una lista de opciones o argumentos. Los argumentos están separados por
espacios.
7
Descripción:
Este comando cambia la contraseña para usuarios y grupos. Un usuario normal, sólo puede
cambiar su propia contraseña, aunque el superusuario puede cambiar todas las contraseñas del
sistema. El administrador de un grupo puede cambiar cualquier contraseña del grupo. También
se cambia la información sobre la cuenta, como el nombre completo, el login de entrada o la
caducidad de la cuenta y los intervalos de caducidad de la contraseña.
Sintaxis
passwd
Se utiliza para visualizar los ficheros del directorio actual. La orden ls presenta los ficheros por
orden alfabético. También puede indicarse como argumentos los nombres de ficheros o directorios, y
además se pueden utilizar las máscaras * e ? igual que en DOS. Si se indican varios ficheros como
argumentos, estos deben ir separados por espacios en blanco.
ls –l, o simplemente l, es similar a la salida del comando DIR en el DOS. Con esta orden, además
de indicar los nombres de los ficheros, se presenta la siguiente información (atributos):
- Tipo de fichero: ocupa un carácter (-: normal, d:directorio, p:pipe, c:fichero especial de
caracteres, b: fichero especial de bloques, l:ligadura simbólica).
- Permisos de lectura/escritura/ejecución: ocupan los siguientes 9 caracteres, y se dividen en
permisos de usuario (los 3 primeros), permisos del grupo (los 3 siguientes) y permisos para
otros usuarios.
- Nº de ligaduras no simbólicas al fichero: nº de entradas de directorio que se refieren al
fichero.
- Usuario propietario del fichero.
- Grupo propietario.
- Tamaño del fichero en bytes.
- Fecha y hora de la última modificación del fichero.
- Nombre del fichero.
8
-a Con esta opción se visualizan también los ficheros ocultos. Un fichero es oculto si su primer
carácter es un punto.
-R Si el argumento es un directorio, la opción R visualiza el subárbol de directorios que cuelga de él,
así como los ficheros contenidos en cada uno de esos subdirectorios.
-F Indica para cada fichero su tipo (/si es un subdirectorio, * si es un ejecutable y @ si es una ligadura
simbólica).
-C Realiza el listado de una forma más compacta, por columnas.
-r Realiza la salida en orden alfabético inverso.
-d Si el argumento pasado a la orden es el nombre de un directorio, no nos muestra su contenido, sino
que muestra los atributos correspondientes a dicho directorio.
-1 La salida se presenta en una sola columna
-m La salida se presenta separada por comas.
Ejemplo1: Observar la diferencia existente entre los resultados de las dos órdenes siguientes:
- ls –dl /etc
- ls –l /etc
Ejemplo2: Indica el comando y las opciones correspondientes a usar para mostrar el nombre de
cualquier fichero (incluidos los ocultos) introducido/s como argumento/s desde el directorio actual y en
una sola línea.
- ls –am arg1, arg2, .arg3, ....
- ls –a –m arg1, arg2, .arg3, …
Para movernos por el árbol de directorios se usan unas órdenes idénticas a las del DOS.
Con esta orden se cambia el directorio actual, siendo éste ahora el indicado en la orden.
- El punto simple “.” indica el directorio actual.
- Los dos puntos consecutivos “..” el directorio padre del actual.
- La barra hacia la derecha ( / ), el directorio raíz.
La orden “cd” sin argumentos lleva al usuario que la invoca a su directorio “HOME”.
Sintaxis: cd [camino_subdirectorio]
Permite borrar ficheros del sistema, aunque para ello necesitamos disponer de ciertos derechos
sobre el fichero y sobre el directorio donde éste se encuentre. La opción r de esta orden nos permite borrar
incluso directorios, aunque estos no estén vacíos. Por tanto, la orden “rm – r” debe manejarse con
cuidado.
9
1.9.5. Gestión básica de ficheros.
Un fichero es una secuencia de bytes que reside en disco o cinta. En Unix no se realiza una
interpretación de la estructura lógica de los ficheros, de forma que todos son tratados por igual,
independientemente de su contenido. Así, todos los ficheros (ya sean ficheros de texto, ficheros de datos
con una cierta estructura lógica o ficheros ejecutables) se consideran como una secuencia finita de bytes.
El sistema operativo reconoce el fin de fichero mediante un carácter especial situado al final de todos los
ficheros (Control-d).
cat [camino_fichero]
La salida se envía al dispositivo de salida por defecto, que habitualmente será la pantalla.
Podremos redireccionar la salida a un fichero, mediante el símbolo “>”, de la forma siguiente:
Esta orden además, nos permitirá crear pequeños ficheros de texto, mediante la siguiente
sintaxis:
cat > nuevo_fichero o bien cat-> nuevo_fichero
Una vez pulsado Intro, se podrán escribir líneas de texto, que se irán añadiendo al fichero. Se
finaliza la entrada de líneas de texto tecleando Control-d.
Además, el comando cat se puede usar también para concatenar ficheros, con el siguiente
formato:
cat fichero1 fichero2 ... ficheron > fichero_union
Realiza la copia de ficheros. Con esta orden se pueden realizar dos tipos de operaciones:
- Si fuente y destino son ambos nombres de ficheros, entonces se realiza la copia de fuente a
destino.
- Si destino es el nombre de un directorio, entonces fuente pueden ser varios ficheros
(separados por blancos, o definidos por medio de * e ?), y la orden copiará entonces los
ficheros indicados sobre el directorio destino.
En todos los casos, se requieren ciertos derechos para poder realizar esas acciones.
La opción r de la orden permite hacer operaciones de copia de subárboles de directorios
completos.
Su sintaxis es:
cp [-r] fuente destino
Ejemplo: Indicad cómo podríamos copiar todo el contenido de un directorio1 (/etc), incluidos
todos sus subdirectorios, en otro directorio2 (/tmp).
cp –r /etc/* /tmp
Realiza el movimiento de ficheros. Cuando ambos argumentos son nombres de ficheros esta
orden tiene el significado de cambiar el nombre del fichero fuente, mientras que si destino es un
directorio se trasladan los ficheros indicados en fuente a destino.
mv fuente destino
10
1.9.5.4. Comando “ln”.
Establece ligaduras. Crea una nueva entrada de directorio que corresponde a un fichero ya
existente (el nombre de la ligadura no puede coincidir con el nombre de otra entrada de directorio ya
existente en el directorio en que va a ser creada). El usuario percibe la sensación de que otro dichero ha
sido creado (el especificado como destino), con el mismo contenido del fichero fuente. Sin embargo, la
copia es ficticia, ya que el fichero destino es el mismo que el fuente, y cualquier modificación posterior
de uno afectará al otro, ya que se trata de dos nombres para un mismo fichero ( en disco existe un único
fichero físicamente almacenado).
Sintaxis: ln [-s] fuente destino.
Cuando se borra una ligadura a un fichero, sólo se borra el nombre especificado en la orden rm.
El fichero sólo se borra (su contenido) cuando se borra la última referencia al mismo. Hay que indicar que
un fichero puede estar, por medio de ligaduras, en varios directorios al mismo tiempo. Sin embargo, esto
no será posible si los directorios están en distintos dispositivos.
También es posible establecer ligaduras entre directorios, con la opción s del comando ln (se
crea lo que se llama una ligadura simbólica, que es una entrada de directorio cuyo contenido es
únicamente un nombre de ruta). Las ligaduras simbólicas no se contabilizan en el número de ligaduras al
directorio que aparece en el listado obtenido con la orden ls –l.
Las ligaduras (simbólicas o no) se borran siempre con la orden rm, incluso aunque apunten a un
directorio.
Ejemplo1.- Cread una ligadura de un fichero a otro y obtener los atributos asociados a ambas
ligaduras (derechos, tamaño, etc...). Comprobad que coinciden, y que ambos se ven afectados por
cualquier modificación sobre uno de ellos.
Ejemplo2.- Cread una ligadura simbólica a un directorio. Obtener los atributos de las dos
entradas y compararlas. Observad que si en este caso se borra el directorio, la ligadura permanecerá como
entrada de un directorio, pero no apuntará a ningún sitio.
Los usuarios pueden enviarse mensajes (cortos) que aparecerán sobre el terminal del destinatario
(si éste no ha desactivado tal posibilidad) con la orden “write”. Con esta orden se envía el mensaje que se
teclee a continuación al usuario especificado, que debe estar conectado al terminal indicado. El mensaje
se termina de escribir tecleando “Control-d”. Es posible evitar que otros usuarios interfieran nuestro
trabajo con mensajes en pantalla mediante la orden “mesg n”. Para permitir de nuevo la recepción de
mensajes se teclea “mesg y”. Su sintaxis es:
Permite conocer qué usuarios están conectados al sistema en un momento dado. Dicha orden
nos indica en la segunda columna el terminal sobre el que están trabajando los usuarios conectados al
sistema.
Permite conocer qué usuarios están conectados al sistema en un momento dado y también nos
indica el tiempo que los usuarios llevan sin acceder al terminal, y desde dónde están conectados al
sistema.
Permite conocer el terminal sobre el que se está trabajando en un momento dado, puesto que esta
orden devuelve el nombre del fichero especial de caracteres asociado al terminal.
Es posible enviar el contenido de ficheros a los terminales, mediante una operación de escritura
sobre el fichero especial que tengan asociado.
11
Ejemplo1: ¿Qué órdenes podríamos usar para enviar el contenido de un fichero determinado llamado
pepe a un terminal determinado (tty2)?
- cat pepe > /dev/tty02
- cp pepe /dev/tty02
Ejemplo2: ¿Qué ocurrirá si un usuario cualquiera ejecuta ls -lR / > /dev/tty02
Son atributos que definen la forma en que puede acceder al fichero o directorio un usuario
cualquiera del sistema.
Cuando un usuario crea un fichero o directorio en el sistema, automáticamente se convierte en su
propietario (owner), y en principio puede leer y escribir sobre él. El resto de usuarios (salvo naturalmente
el superusuario) sólo podrá leerlo. Esta situación puede cambiarse.
Los usuarios, al ser creados por el superusuarios, se asignan a un grupo de usuarios.
Los permisos de acceso a un fichero se dividen en tres niveles:
- Accesos para el propietario.
- Accesos para un grupo de usuarios.
- Accesos para el resto.
Además, existen tres clases de permisos:
- De lectura
- De escritura.
- De ejecución.
En el caso de un directorio, el permiso de lectura indica que se puede examinar el contenido del
directorio (leer sus entradas de directorio), el de escritura que se pueden crear, modificar o borrar entradas
de directorio, y el de ejecución que se puede acceder al directorio (se puede pasas a través del directorio
en busca de otros subdirectorios).
Los derechos no se suman, es decir, se aplican exclusivamente aquellos que corresponden a la
categoría en la que se enmarca el usuario (usuario, grupo u otros).
Ejemplo: Se han obtenido los atributos de un fichero a.out mediante la orden “ls –l a.out” y el resultado
ha sido el siguiente:
-rwx—xr-x 1 al123 alumnos 12798 Dec 31 18:11 a.out
Donde “quien” puede ser una combinación de: a(all) para todos, u (user) para el propietario del
fichero (valor por defecto), g (group) para el grupo, y o (others) para el resto de usuarios.
Los permisos pueden ser una combinación de: r para lectura, w para escritura y x para ejecución.
La opción R se emplea para que la orden se aplique no sólo a los ficheros que respondan al
patrón indicado, sino también en todo el subárbol de directorios que cuelgue del directorio afectado.
OBSERVACIONES:
Para borrar un fichero se necesitan derechos de acceso y escritura sobre el directorio en donde se
encuentre el fichero, así como el derecho de escritura sobre el fichero. Sin embargo, para modificar el
fichero (sin borrarlo) sólo se necesita el derecho de acceso al directorio, y el derecho de escritura sobre el
fichero (aunque sin derecho de lectura no se podrá leer su contenido).
Ejemplo1: Indicad la orden a ejecutar para añadir derechos de lectura y escritura a los ficheros (o
directorios) del directorio /usr/alumnos/al123 que empiecen por “a”, para los usuarios del grupo al que
pertenece el usuario.
chmod g+rw /usr/alumnos/al123/a*
12
Ejemplo2: Para los mismos ficheros anteriores, quitar derechos de ejecución al usuario propietario, y
poner el derecho de lectura para los usuarios que no pertenecen al grupo.
chmod u-x, o+r /usr/alumnos/al123/a*
Ejemplo3: Para establecer que el usuario propietario tenga únicamente derechos de lectura, y que los
demás usuarios no tengan ningún derecho:
chmod u=r, go-rwx /usr/alumnos/al123/a*
Un usuario puede modificar la máscara de derechos por defecto que se aplica sobre los ficheros o
directorios recién creados mediante la orden “umask”:
El sistema utiliza este valor “umask” para definir los derechos de los ficheros y directorios recién
creados, sustrayendo este valor al indicado en la llamada al sistema realizada para la creación del fichero
o directorio (open o creat). De esta forma, como el sistema crea normalmente los ficheros y directorios
con la máscara 0666, si el valor de umask es 0022, la diferencia es 0644, que son los derechos que
finalmente se asignan al fichero o directorio.
Ejemplo: Para conseguir que los ficheros o directorios recién creados adquieran como máscara
de derechos por defecto “rw-rw—w-“ tendríamos que considerar el valor octal 0004. ¿Por qué?.
Permite transferir la propiedad del fichero o directorio a otro usuario. Su sintaxis es:
siendo usuario el nombre del nuevo usuario propietario de los ficheros indicados. Por supuesto,
sólo el propietario (NO EN LINUX) de los ficheros indicados o el superusuario pueden ceder la
propiedad de los mismos. La opción R se emplea de nuevo para que la orden se aplique no sólo a los
ficheros que respondan al patrón indicado, sino también en todo el subárbol de directorios que cuelgue del
directorio afectado.
Permite transferir la propiedad del dichero a todo el grupo. La sintaxis es similar al comando
chown y funciona del mismo modo. En Linux, sólo la puede ejecutar el superusuario al igual que chown.
13
1.9.8. Recepción y envío de correo. Comando mail.
Tecleando mail + Intro se visualiza el primer mensaje. Si se teclea “?” se muestra un menú de
ayuda con las distintas opciones del mail:
mail direccion_usuario
A continuación se escribe el texto del mensaje, finalizando con <Control-d>. La dirección del
usuario puede especificarse de diversas formas, dependiendo del sistema de que se trate. En todo caso, si
se desea enviar un mensaje a un usuario en nuestro sistema local basta con poner su nombre de login en el
sistema.
Es posible también escribir primero el texto del mensaje en un fichero, y después ejecutar la
orden:
mail usuario < fichero
14
1.10. Comandos de uso general.
1.10.1. Editores.
Los sistemas Unix actuales vienen dotados de editores manejables para usar sobre entornos X-
Windows. Aún así, los siguientes editores han sido y son los más usados, sobre todo el joe.
joe fichero.txt
vi fichero.txt
15
Los comandos aceptados por vi son combinaciones de unas pocas letras, y algunos de ellos
provocan la entrada del editor en modo texto. En el modo texto el editor acepta caracteres desde teclado
para introducirlos en el fichero, así como la tecla de borrado (Del). Para volver al modo comando se pulsa
la tecla de escape.
Cuando no se especifica ningún argumento, el comando date devuelve la fecha y hora actual del
sistema. El superusuario también puede utilizar este comando para establecer la fecha y hora del sistema,
con la sintaxis:
date mmddhhmm[yy]
También es posible indicar al comando “date” un formato de presentación de la fecha y hora, con
la sintaxis:
date “+formato”
El formato se especifica mediante los llamados descriptores de campo, que van precedidos por el
símbolo “%”, y son reemplazados en la salida en pantalla por sus valores asociados.
16
n Inserta un carácter de retorno de carro
t Inserta un carácter de tabulación
m Nº del mes del año
d Nº del día del mes
y Últimos dos dígitos del año
D Fecha en el formato clásico: mm/dd/yy
H Hora (de 00 a 23)
M Minutos (de 00 a 59)
S Segundos (de 00 a 59)
T Hora en el formato clásico: HH:MM:SS
w Día de la semana (de 0 a 6, siendo el Domingo el 0)
a Día de la semana de forma abreviada (Sun, …, Sat)
h Mes abreviado (Jan, ... , Dec)
r Hora en formato AM/PM
Ejemplo1: Indicar la orden correspondiente a usar por el usuario para establecer como fecha y
hora del sistema el 27 de Abril del 2005, a las 16:30 horas.
date 0427163005
Ejemplo2: Indicar la orden correspondiente para obtener la fecha con el siguiente formato:
Con esto comando podemos visualizar ficheros de texto de cierto tamaño, que no quepan en una
sola pantalla, pues muestra sus contenidos pantalla a pantalla.
Cuando se ejecuta la orden “pg fichero”, aparece el comienzo del fichero en pantalla y una línea
de ordenes en la parte inferior de la misma.
17
1.10.3.2. Comando more.
Permite también visualizar un fichero pantalla a pantalla. En este caso, con la tecla de espacio se
va pasando de una pantalla a otra, mientras que si se pulsa q se termina la visualización del fichero, y se
abandona la ejecución.
El comando “more” se utiliza con mucha frecuencia en pipes para ir mostrando pantalla a
pantalla los resultados de algún programa:
ls –lR / |more
Es posible visualizar el contenido de ficheros en ascii (-c), octal (-b), decimal (-d) y
hexadecimal(-x).
El comando “bpe” nos permite ver y editar ficheros binarios. Se invoca poniendo como
argumento el nombre del fichero a editar.
Permite comparar dos ficheros, para ver si son idénticos. Si los ficheros resultan diferentes, se
muestra el nº de línea y el nº de carácter dentro de la línea donde se ha encontrado la primera diferencia.
Si ambos ficheros son idénticos no se muestra ningún resultado en pantalla. En este caso puede
comprobarse que realmente son idénticos consultando el valor de errorlevel (echo $?), que debería ser 0.
El programa cmp admite la opción s, que suprime los mensajes en pantalla, y retorna:
- 0 si los ficheros son idénticos.
- 1 si los ficheros son diferentes.
- 2 si algún fichero es inaccesible.
Este comando nos permite comparar dos ficheros ordenados alfabéticamente por líneas. Como
resultado nos indica en una primera columna las líneas que únicamente se encuentran en el primer
fichero, en una segunda columna las líneas que únicamente se encuentran en el segundo fichero, y en una
tercera columna las líneas que pertenecen a ambos ficheros.
Localiza las diferencias entre dos ficheros de texto, indicando las acciones que habría que
realizar para hacerlos coincidir. Además, el errorlevel devuelto es como el del comando cmp.
Ejemplo1: Consideremos los ficheros siguientes y probar las órdenes comm y diff con ambos:
fichero1: fichero2:
linea 1 de fichero1 linea 1 de fichero2
linea 2 de fichero1 y fichero2 linea 2 de fichero1 y fichero2
linea 3 de fichero1 y fichero2 linea 3 de fichero1 y fichero2
linea 4 de fichero1 linea 4 de fichero2
18
1.10.5. Operaciones sobre ficheros de texto.
Otra posibilidad de este programa es organizar el fichero o ficheros de entrada por campos,
utilizando un cierto carácter como delimitador de campos. Mientras no se especifique otra cosa, el
separador es una blanco.
c Comprueba si todos los ficheros indicados están ya ordenados. Si lo están, devuelve como
errorlevel un 0, mientras que si no lo están, muestra un mensaje indicativo en pantalla, y el
errorlevel es 1
m Mezcla los ficheros argumentos, que deben estar ya ordenados, para presentar en la salida
estándar el resultado de ordenar el conjunto (se utiliza cuando los ficheros son grandes por
razones de eficiencia).
d Ordena considerando únicamente los caracteres alfabéticos, numéricos y blancos, ignorando
los demás.
f Ignora la distinción entre las mayúsculas y minúsculas
o fichero Envía la salida del programa al fichero indicado.
r Realiza la ordenación en sentido inverso
t separador El carácter indicado como separador se utiliza para delimitar campos dentro de cada línea
del fichero o ficheros indicados como argumento (por defecto es un blanco)
n Realiza una ordenación aritmética cuando aparece al comienzo de la línea una cadena de
caracteres numérica, precedida opcionalmente por un cierto nº de blancos, y un signo
aritmético (+,-)
M Se consideran los tres primeros caracteres de cada línea como un nombre abreviado de mes
(Jan, Feb, etc), de modo que se ordena siguiendo su enumeración.
u Para aquellas líneas que tengan igual clave, sólo considera una de ellas.
+n Se salta n campos antes de empezar a ordenar
Se emplea para eliminar una parte en cada línea de un fichero de texto, ya sea atendiendo a una
división en campos, o bien según una delimitación de columnas.
Este comando toma dos ficheros como argumento, y va procesándolos simultáneamente, leyendo
en cada etapa una línea de cada fichero, uniéndolas separándolas por un tabulador. Con la opción d puede
especificarse un separador diferente.
Se emplea para unir las líneas de dos ficheros de texto de acuerdo a una clave común. Se
considera que cada fichero argumento constituye una tabla relacional, siendo cada línea de texto en
ambos ficheros un registro de la tabla, dividida en campos según el separador empleado (un blanco por
19
defecto). Por defecto, se emplea como clave el primer campo de cada línea en ambos ficheros, los cuales
deben estar ordenados de acuerdo a dicha clave.
En la salida por defecto se muestra una línea por cada par de líneas de los ficheros argumento
que tengan la misma clave, que corresponde a la unión de ambas líneas, pero sin duplicar la clave común.
Se emplea la opción t para indicar un separador diferente. Asimismo, si se desea utilizar un
campo distinto como clave se emplea la opción “-jn m”, siendo n el nº del fichero (1 ó 2), y m el nº de
campo en el fichero argumento n.
Permite localizar ficheros que satisfacen un determinado criterio, para realizar a continuación
alguna acción sobre los mismos. La búsqueda comienza en el directorio que se especifica como primer
argumento, y desciende a todo el subárbol de directorios que dependen de éste.
La sintaxis de esta orden es la siguiente:
Para seguir escribiendo la orden en una siguiente orden, se teclea una barra hacia atrás. Véase
ejemplo5
20
Los criterios de búsqueda del comando find son:
-name nombre_fichero Busca el fichero cuyo nombre se indica. También puede especificarse una
máscara de búsqueda, encerrando todo el nombre entre comillas dobles,
mediante la sintaxis siguiente:
* Cualquier tira de caracteres
? Un carácter cualquiera
[...] Cualquier carácter encerrado entre los corchetes
[^...] Cualquier carácter, excepto los encerrados entre corchetes
-type x Busca ficheros de dispositivo de bloques (x=b), de caracteres (x=c),
directorios (x=d), pipes (x=p), ligaduras simbólicas (x=l), o ficheros
regulares (x=f)
-links n Busca aquellos ficheros que tienen n ligaduras (hard links) establecidas
-user nombre_usuario Busca aquellos ficheros que pertenecen al usuario indicado
-group nombre_usuario Busca los ficheros que pertenecen al grupo de usuarios indicado
-size n Busca aquellos ficheros que ocupan en disco n bloques (512 bytes por
bloque). Si el nº n va seguido de una c, se buscan los ficheros que tengan
ese tamaño n en bytes
-atime n Localiza los ficheros que fueron accedidos hace exactamente n dias. La
orden find por sí misma modifica la fecha de acceso. Si se pone +n se
interpreta como localizar los ficheros accedidos hace más de n días, y si se
pone –n se interpreta como localizar los ficheros accedidos en los últimos
n días.
-mtime n Localiza los ficheros que fueron modificados hace exactamene n días.
También son válidos +n y -n
-ctime n Localiza los ficheros que fueron cambiados (modificados sus atributos)
hace exactamente n días. Son válidos +n y –n.
-perm [-] m Localiza ficheros cuya máscara de derechos sea exactamente m. Si se pone
un signo menos delante de la máscara, entonces busca ficheros que tengan
como mínimo los derechos indicados en la máscara.
Ejemplo1: Indicar la orden que permita eliminar todos los ficheros del directorio actual (y de sus
subdirectorios) que no han sido utilizados en los últimos cien días.
$ find . –atime +100 –exec rm \{\} \;
Ejemplo2: Indica la orden que permita localizar y presentar en pantalla los ficheros cuyo nombre
comience con “pe”, que se encuentren en el subárbol de directorios “/usr/alumnos”.
$ find /usr/alumnos –name “pe*” -print
Ejemplo3: Indicar la orden que permita localizar y presentar en pantalla los ficheros regulares cuyo
nombre empieza por “f” o “g” y que ocupan en disco 3 o más bloques, dentro del subárbol de directorios
“/usr”.
$ find /usr -type f –name “[fg]*” –size +2 –print
$ find /usr \( -type f –a –name “[fg]*” –a –size +2 \) -print
Ejemplo4: Indicar la orden que permita localizar y presentar en pantalla los ficheros del usuario al123
cuyo nombre empieza por “pe” (en todo el árbol di directorios).
$ find / -name “pe*” –a –user al123 -print
Ejemplo5: Indicar la orden que localiza y presenta en pantalla el nombre y atributos de los ficheros y
directorios que o bien pertenecen al usuario al123 y su nombre empieza por “f” o “p”, o bien no
pertenecen al grupo escuela (en todo el árbol de directorios).
$ find / \(\(\( -user al123 \) –a \( -name “[fp]*” \) \) –o \
\( ! – group escuela \) \) –exec ls –l \{\} \;
Permite localizar una palabra clave o una frase en varios ficheros, indicando las líneas y ficheros
en los que aparece.
grep [opciones] patrón ficheros
El patrón utilizado puede contener espacios en blanco, pero en tal caso tenemos que encerrarlo
entre apóstrofos o comillas dobles. Asimismo, para expresar el nombre de los ficheros podemos utilizar
las máscaras (* y ?).
21
Los patrones de búsqueda no tienen por qué limitarse a palabras o frases determinadas. Pueden
construirse patrones más generales utilizando los formatos de sustitución siguientes:
Ejemplo1.- Indicar la orden que busca la palabra pepito en los tres ficheros indicados: pepe1, pepe2,
pepe3.
$ grep pepito pepe1 pepe2 pepe3
Ejemplo2.- Indicar la orden que localiza las líneas que contienen la palabra “con” en los ficheros del
directorio actual cuyo nombre empiece por “fic”. Diferenciar entre éstas dos órdenes:
Esta orden va a mostrar las líneas (y los nºs de línea) de los ficheros del directorio actual
cuyo nombre acabe en “.txt” que contengan líneas que empiecen por la palabra “La”, y
acaben en “n” ó “s”.
Ejemplos posibles:
Fic.txt:2: La pinto de colores
Fic.txt:5: La canción
Permite procesar el contenido de un fichero de texto línea a línea, sometiendo a las mismas a
determinadas acciones, enviándose el resultado de este procesamiento a la salida estándar. La sintaxis
básica de este comando es:
sed [opciones] ‘comandos-sed’ fichero
donde las direcciones pueden ser nº decimales especificando líneas concretas del fichero, o
rangos de líneas (en la forma l1, l2 para indicar el rango de líneas desde la l1 hasta la l2), un ‘$’
representando la última línea del fichero e incluso expresiones regulares encerradas entre ‘/’. La forma de
22
construir expresiones regulares es la misma que la descrita para el comando grep. Además, se puede
utilizar “\(“ y “\)” para delimitar campos sobre la línea que encaja en la expresión regular considerada.
Si se desea utilizar más de un comando de edición hay que introducir un comando por línea y
encerrar la lista completa entre apóstrofos.
Si no se introduce ninguna dirección, la acción indicada afectará a todas las líneas del fichero.
El programa sed acepta las dos opciones siguientes:
-n Suprime las salidas al dispositivo de salida estándar, salvo que se indique de forma
explícita la visualización en la acción de procesamiento.
encajarían en dicha expresión regular. Además, se ha delimitado un campo sobre dicha expresión regular
(el objeto regalado en este caso). Este campo se puede referenciar posteriormente mediante “\1”. Si se
definen más campos, estos se referencian de la misma forma: “\1”,”\2”,etc...
Si se desea utilizar más de un comando de edición hay que introducir un comando por línea y
encerrar la lista completa entre apóstrofos.
a\ linea_texto Añade la línea de texto que sigue al comando a la salida estándar después de
procesar las líneas del fichero de entrada afectadas por el rango indicado
c\ linea_texto Visualiza sobre la salida estándar la línea de texto que sigue al comando,
descartando las líneas de texto del fichero de entrada afectadas por el rango
indicado.
d Borra la líneas indicadas
i\ línea texto Visualiza la línea de texto que sigue al comando, y a continuación procesa las
líneas afectadas, incluso bajo la opción n
p Visualiza el resultado de procesar las líneas afectadas, incluso bajo la opción n
q Abandona
r fichero Lee un fichero, añadiendo el contenido del mismo a la salida estándar, antes de leer
y procesar la siguiente línea desde el fichero de entrada
s/e_reg/n_exp./flags Sustituye “n_exp” por toda ocurrencia de la expresión regular “e_reg”. Algunos
flags admisibles son: g (sustitución global, para que afecte a todas las ocurrencias
de la expresión regular, y no sólo a la primera), p (visualiza el resultado del
procesamiento si el reemplazamiento fue llevado a cabo), w fichero (añade las
líneas procesadas al fichero indicado si se realizó el reemplazamiento). Si en
“e_reg” se han delimitado campos por medio ‘\(‘, ‘\)’, es posible referenciarlos en
“n_exp” por medio de ‘\1’, ‘\2’, etc
s/e_reg/&n_exp/ Inserta “n_exp” detrás de la expresión regular “e_reg”, para toda línea que contenga
una cadena que encaje en la citada expresión regular.
w fichero Añade las líneas afectadas al fichero indicado
= Visualiza el número de línea actual sobre la salida estándar
23
Ejemplo3: Indicar la orden que permita borrar las líneas de un fichero que contengan la palabra “clave”.
sed ‘/clave/d’ fichero
Ejemplo4: Indicar la orden para insertar una línea en blanco detrás de cada línea de un fichero.
sed ‘i\>’ fichero
Ejemplo5: Indicar la orden para borrar todas las líneas vacías de un fichero:
sed ‘/^$/d’ fichero
Ejemplo6: Indicar la orden para mostrar el campo “comentario” del fichero /etc/passwd, que contiene la
información de los usuarios del sistema (en dicho fichero cada línea corresponde a la información de un
usuario, y esta información está dividida en campos separados por ‘:’)
sed –n “s/^al123:.*:.*:.*:\(.*\):.*:.*$/ \1 /p” /etc/passwd
Ejemplo7: Indicar la orden para obtener el valor asignado a la variable PATH en el fichero .profile de
vuestro usuario.
sed –n “s/^PATH=//p” /usr/alumnos/al123/.profile
Ejemplo8: Probar finalmente el siguiente ejemplo, y descubrir su efecto:
sed “/^c[aeh].*.*.*[^n]$/d” fichero > fichero2
1.11. El Shell
El shell es el intérprete de comandos en Unís. Actúa como interface del usuario con el sistema
operativo, traduciendo sus órdenes y ejecutando sus programas. Los sistemas Unix suelen ir dotados de
varios shells, de forma que el usuario puede elegir aquél que le resulte más cómodo para trabajar. Entre
ellos, los más utilizados son el shell Bourne y el shell-C. Siendo el primero el que vamos a ver.
El proceso asociado al intérprete de comandos se identifica por el nombre sh (si se trata del shell
Bourne), y un usuario puede en cualquier momento crearse un shell integrado dentro del actual
ejecutando este programa:
$ sh
Al ejecutar esta orden aparece de nuevo el inductor o prompt del sistema ($), pero ahora este
prompt corresponde al nuevo shell creado. Para abandonar estos shells anidados se debe teclear la orden
exit o bien Control-d, y en tal caso se retorna al shell anterior.
También podemos lanzar un shell anidado y ejecutar bajo él un fichero de comandos, que en Unix
se llama shell-script, de forma que cuando éste termine se regrese al shell progenitor. Para ello se requiere
el derecho de lectura sobre el fichero de comandos. La sintaxis es:
$ sh shell-script
También es posible ejecutar un shell-script de forma directa, tecleando su nombre sobre el prompt
del shell. También se crearía en este caso un nuevo shell integrado en el actual para la ejecución de dicho
shell-script, pero se necesitan derechos de lectura y ejecución sobre el fichero de comandos:
$ shell-script
24
- Otra de las posibilidades del shell es la creación de pipes, cuyo objetivo es ejecutar en
paralelo dos procesos, haciendo que la salida de uno de ellos sea la entrada del otro. La
creación de pipes se realiza mediante el símbolo “|!, que separa los dos procesos
considerados.
Ejemplo: Mediante la orden siguiente obtenemos un listado alfabético de los ficheros del
directorio actual.
ls –r | sort
- Los sistemas Unix disponen de diversas herramientas, llamadas filtros, que se emplean
habitualmente en pipes para modificar en cierta forma la salida de algún proceso.
o Uno de estos programas es “tr”, cuyo objeto es transformar algún carácter o grupo
de caracteres. Puede indicarse en una sola orden “tr” un cambio múltiple.
$ ls –l | tr e t
$ ls –l | tr ap bc
o Otro de estos programas es “tee”, que envía la salida del proceso precedente en la
pipe hacia la salida estándar y hacia un fichero (indicado como argumento).
$ ls –l | tee salida
Una de las posibilidades del shell es la definición de variables, para lo cual se emplea la sintaxis:
$ nombre_variable=valor
Ejemplo:
$ pepe=10
$ echo “el me debe $pepe pesetas” -> el me debe 10 pesetas
$ echo ‘el me debe $pepe pesetas” -> el me debe $pepe pesetas
${variable}: Se referencia el valor de la variable (las llaves se ponen sólo cuando en la línea en
que aparece referenciada, aparece detrás alguna información, de forma que éstas actúan como
separadores.
${variables:-palabra}: Si la variable es no vacía, se referencia su contenido, pero si tiene
asignado un valor nulo (o no ha sido declarada) se referencia el valor literal palabra, pero no se asigna
nada a la variable.
${variable:=palabra}: Si la variable tiene asignado un valor no vacío, se referencia su contenido.
En caso contrario se le asigna el valor literal palabra y se referencia dicho valor (esta orden no sirve para
los parámetros $0, $1, ...).
25
${variable:?palabra}: Si existe la variable indicada y tiene asignado un valor no nulo se le asigna
el valor palabra. En otro caso, visualiza el literal “variable:palabra” y abandona la ejecución del shell
actual.
${variable:+palabra}: Si la variable indicada existe y tiene un valor no nulo, se referencia el
valor literal palabra. En caso contrario, se referencia una cadana vacía.
Los dos puntos (:) pueden omitirse, y en tal caso sólo se realizan las comprobaciones de existencia
de la variable, no las relativas a si tiene asignado un valor vacío.
Las variables tienen visibilidad en principio sobre el shell donde han sido declaradas. Para
extender su visibilidad a nuevos shells anidados se emplea la orden “export”, con la sintaxis:
$ export variable variable variable ...
Esta orden hace que los valores de las variables indicadas como argumentos sean visibles en los
nuevos shells anidados. Sin embargo, hay que observar que en realidad en cada uno de estos nuevos shells
se crearía una nueva copia de cada variable, asignándole inicialmente el valor que tenía en el shell
anterior; evidentemente, al retornar al shell anterior la variable tendría el último valor asignado en este
shell, sin tener en cuenta las modificaciones realizadas en los shells anidados. A las variables del shell
exportadas con esta orden se las llama variables de entorno.
Tecleando esta orden sin argumentos se muestran las variables exportadas actualmente.
Podemos ver las variables de entorno asignadas en un momento dado con la orden “env”.
HOME. Indica el directorio home del usuario actual. Cada vez que se ejecuta el proceso sh para invocar
un nuevo shell, el sistema asigna el valor de esta variable según la información introducida por el
administrador durante la creación del usuario.
PATH. Indica los directorios en los que el shell buscará las órdenes que se le ofrecen para ejecutarlas.
Los directorios que constituyen el PATH se separan por ‘:’.
MAIL. Se asigna mediante esta variable el fichero que actúa como buzón de nuestro correo.
PS1. Es el literal que constituye el inductor principal (habitualmente $ para usuarios normales y # para el
superusuario).
PS2. Es el literal que constituye el inductor secundario (habitualmente >).
IFS. Es el carácter separador por defecto de los campos de un fichero (generalmente será un blanco o un
retorno de carro).
SHELL. Indica el tipo de shell asignado al usuario. El tipo de shell de cada usuario lo fija el superusuario
en el momento de crear el usuario.
TERM. Indica el tipo de terminal que se está empleando. Es importante que esté definido correctamente
este valor, porque en caso contrario no funcionarán correctamente algunos programas.
MAILCHECK. Especifica cada cuanto tiempo (en segundos) se revisa el buzón para ver si hay correo
(su valor por defecto es 0, por lo que antes de visualizar cada vez el inductor, el sistema mira en el
buzón). Lo mejor es cambiar dicho valor a un número mayor (por ejemplo: 600 segundos). Si se
encuentra correo en el buzón, el sistema informa al usuario de ello con el mensaje: “You have mail”.
Este fichero oculto contiene un conjunto de órdenes que se ejecutan cada vez que un usuario entra
al sistema, antes de mostrarle el inductor. Además de ejecutarse las órdenes contenidas en el fichero
.profile se ejecutan (previamente) las órdenes contenidas en el fichero /etc/profile, cuyo propietario es el
administrador, que es el único que puede modificar su contenido.
El fichero .profile puede ser ejecutado directamente (sin abandonar el shell) con la orden
$ . .profile
26
1.11.5. Órdenes internas del shell.
exec [args...].- Se ejecuta el proceso especificado como argumento en lugar del shell (no crea un
nuevo proceso, sino que sobrescribe el espacio de memoria ocupado por el shell, por lo que
cuando concluye su ejecución retorna al proceso padre del shell).
Cuando se ejecuta sin argumentos devuelve siempre 0 como retorno de errorlevel. En caso
contrario, se concatenan los argumentos para conformar una línea de órdenes, la cual es a continuación
ejecutada. El valor de errorlevel obtenido como resultado de la ejecución de dicha línea de órdenes es el
valor de errorlevel devuelto por eval.
La orden eval suele emplearse junto al operador grave ‘, que se emplea habitualmente para
ejecutar una línea de órdenes (encerrada entre dos apóstrosfos hacia la izquierda), y asignar su salida de
resultados estándar como valor de una cierta variable del shell.
Ejemplo1: Para asignar a la variable “x” el tipo de terminal que se está empleando:
$ x=’echo $TERM’
$ echo $x
27
1.12. Implementación de shell-scripts.
En esta sección se describen las construcciones de control del lenguaje de órdenes aceptado por el
shell Bourne, utilizadas habitualmente en shell-scripts.
La sintaxis es
$ if comando; then comando; [else comando;] fi
Para introducir varios comandos en la parte then o else, estos deben aparecer en líneas distintas,
tecleando \ al final de cada línea. También pueden dividirse las distintas partes de esta orden en varias
líneas, omitiendo en este caso los puntos y coma.
Se puede utilizar como comandos true (devuelve como errorlevel 0) o false (devuelve errorlevel
distinto de 0).
Ejemplo1:
$ if true
then
echo va bien
fi
Ejemplo2: Crear un shell-script para asignar ciertos derechos (especificados como primer
argumento) a un fichero pasado como segundo argumento.
$ cat derechos
if chmod $1 $2
then
echo “Asignados derechos $1 sobre fichero $2”
else
echo “No pueden establecerse esos derechos”
Mediante esta orden podemos evaluar expresiones condicionales. Su función es evaluar una
expresión condicional, de forma que si ésta resulta cierta devuelve un errorlevel igual a 0, y si ésta es
falsa devuelve un errorlevel distinto de 0. La sintaxis es:
28
Las expresiones básicas admitidas por la orden test son:
-r fichero Evalúa a cierto si el fichero existe y tiene permiso de lectura para el usuario que accede
-w fichero Evalúa a cierto si el fichero existe y tiene permiso de escritura para el usuario que accede
-x fichero Evalúa a cierto si el fichero existe y tiene permiso de ejecución para el usuario que accede
-f fichero Evalúa a cierto si el fichero existe y es un fichero regular
-d fichero Evalúa a cierto si es un directorio.
-c fichero Evalúa a cierto si el fichero existe y es un fichero especial de caracteres.
-b fichero Evalúa a cierto si el fichero existe y es un fichero especial de bloques
-h fichero Evalúa a cierto si fichero existe y es una ligadura simbólica
-p fichero Evalúa a cierto si fichero existe y es una pipe
-u fichero Evalúa a cierto si fichero existe y tiene activo su bit SETUID
-g fichero Evalúa a cierto si fichero existe y tiene activo su bit SETGID
-s fichero Evalúa a cierto si fichero existe y tiene tamaño mayor que 0
-t [fildes] Evalúa a cierto si fichero abierto cuyo descriptor es el nº fildes (1 por defecto) está
asociado a un terminal
-z s1 Evalúa a cierto si la longitud de la cadena s1 es 0
-n s1 Evalúa a cierto si la longitud de la cadena s1 es distinta de 0
s1=s2 Evalúa a cierto si ambas cadenas son idénticas
s1!=s2 Evalúa a cierto si ambas cadenas no son idénticas
s1 Evalúa a cierto si s1 no es la cadena vacía
n1 –eq n2 Evalúa a cierto si los dos enteros (n1,n2) son exactamente iguales
n1 –lt n2 Evalúa a cierto si el entero n1 es extrictamente menor que n2
n1 –gt n2 Evalúa a cierto si el entero n1 es extrictamente mayor que n2
n1 –le n2 Evalúa a cierto si el entero n1 es menor o igual que n2
n1 –ge n2 Evalúa a cierto si el entero n1 es mayor o igual que n2
n1 –ne n2 Evalúa a cierto si el entero n1 es distinto que n2
Ejemplo1:
$ for VAL in 1 2 3 4
do
echo $VAL
done
Ejemplo2:
$ for FICHERO in *
do
echo $FICHERO
done
while comando
do until condición do
do
comando/s comando/s
done done
29
1.12.3.3. Comando expr.
Ejemplo:
$ VAL=1
$ while [ $VAL –lt 11 ]
do
echo $VAL
VAL=’expr $VAL + 1’
done
El comando read permite solicitar un valor por teclado y asignárselo a una variable. Su sintaxis es:
read variable
El efecto del comando exit es abandonar el shell con un valor de errorlevel igual a n. Si no se pone
el argumento, entonces se abandona el shell arrojando como errorlevel el valor devuelto por la última
orden ejecutada. Su sintaxis es:
exit [n]
La orden break se emplea para abandonar un bucle (for o while) en tantos niveles de anidamiento
como se especifique (si no se pone el argumento, se supone que éste es 1, que es lo habitual). Su sintaxis
es:
break [n]
Ejemplo1: Escribid un shell-script que al ejecutarlo pida un valor para la variable vari. Si el valor
introducido es exactamente igual a la cadena “pepe”, abandona la ejecución. En caso contrario vuelve a
solicitar otro valor para dicha variable.
Fichero: salta
while true
do
echo INTRODUZCA EL VALOR DE LA VARIABLE
read vari
if [ $vari=’pepe’ ]
then
echo ABANDONO EJECUCION
break
fi
done
Fichero: saltadoble
while true
do
echo INTRODUZCA EL VALOR DE LA PRIMERA VARIABLE
read var1
while true
do
echo INTRODUZCA EL VALOR DE LA SEGUNDA VARIABLE
read var2
if [ $var1=’pepe’ –a $var2 =’juan’]
30
then
echo ABANDONO EJECUCION
break 2
else
if [ $var2=’juan’ ]
then
break
fi
fi
done
done
Su sintaxis es la siguiente:
case palabra in
[patrón[ |patrón]..) comandos;;]..... ..... esac
Ejemplo: Escribid un shell-script que listen los ficheros del raiz o del home según la palabra
introducida por el teclado sea “todos” o “local”. Si la palabra introducida no es ninguna de ellas,
se ejecuta echo “no has introducido una opción válida”
Fichero: procesos
nombre_funcion ( ) { comandos }
Entre los posibles comandos está return número, que finaliza la ejecución de la función
devolviendo el valor indicado como retorno de errorlevel (es el valor devuelto por las funciones del shell).
suma()
{
var=`expr $1 + $2
return $var
}
echo Introduce el primer valor
read var1
echo Introduce el segundo valor
read var2
suma $var1 $var2
echo "La suma de $var1 y $var2 es: $?"
31