Está en la página 1de 12

Shell Linux

Luis Alberto Vargas Aamaco 25 de julio de 2008


El SHELL es un programa que permite usar comandos que son interpretados o ejecutados para controlar el sistema. Linux incluye los mas populares shell Unix: Nombre ASH shell BASH shell C shell Korn shell Z shell Programa /bin/ash /bin/bash /bin/csh /bin/ksh /bin/zsh Descripcin Shell usado por el Unix System V de AT&Ts El shell estndar de Linux, basado en el shell original de Unix, Bourne Shell El shell secundario de Unix. Su sintaxis de programacin se asemeja al lenguaje C Aade muchas caractersticas del C shell al original Bourne Shell Un shell ms pequeo basado en el shell Kornl.

Si bien el shell es un mtodo de interaccin del pasado es mas sosticado para solucionar operaciones que renen gran complejidad. Los GUIs en cambio son mas fciles de usar para tareas relativamente sencillas.

1.

Usando el Shell

Cuando se digitan los comandos del shell, se tiene acceso a un mini-editor. Se mantiene una lista denominada historical list. Para reejecutar un comando, presione echa arriba varias veces hasta localizar el comando y luego presionar Enter para ejecutar el comando. Up Down Left Right Esc f Esc b Ctrl-a Ctrl-e Ctrl-d Retrocede un comando en la history list. Adelanta un comando en la history list. Mueve el Cursor un carcter atrs. Mueve el Cursor un carcter adelante. Mueve el Cursor una palabra adelante. Mueve el Cursor una palabra atrs. Mueve el Cursor el principio de la lnea. Mueve el Cursor al nal de la lnea. Elimina el Carcter actual.

Backspace Elimina el Carcter anterior. Esc d Ctrl-u Ctrl k Ctrl-y Esc . Ctrl-L Tab Esc ? Elimina la palabra actual. Elimina desde el inicio de lnea. Elimina hasta el n de lnea. Deshace la ltima modicacin. Inserta la ltima palabra del comando anterior. Limpia el terminal. Intenta completar la actual palabra, interpretando como chero, nombre de usuario, nombre de variable o comando el cual es determinado por el contexto. Lista los posibles compleciones.

Adicionalmente los shell interpretan la siguiente secuencia: Ctrl-C Enva una seal de interrupcin al proceso actual en ejecucin, el cual concluye con la nalizacin de la aplicacin. 1

Ctrl-D Enva una nalizacin de ujos. Ctrl-Z Suspende la ejecucin del proceso actual. Otros caracteres especiales: # Marca el comando como comentario, es ignorado por el shell. ; Separa comandos, permite ingresar comandos en una sola linea. & Colocado despus de una comando, enva el proceso a una ejecucin en segundo plano.

2.

Comandos y Argumentos
La forma general de un comando de shell tiene la forma:
command options arguments

Donde command determina que operacin realizar el shell, las options y arguments aaden preferencias. Muchas veces el command especica el nombre de archivo de un programa, el cual debe ser iniciado, comando externo. Los ejecutables se guardan en las carpetas /bin, /usr/bin o /usr/local/bin. Las aplicaciones de administracin de sistema en /sbin o /usr/sbin. El shell puede interpretar los siguientes meta caracteres para que designan a nombres de archivos y conjunto de ellos. Carcter * ? [ abc ... ] [a-z] [ ! abc ... ] [ ! a - z] ~ ~userID ~+ ~Signicado Empareja una cadena de cero o mas caracteres Empareja exactamente un carcter Empareja uno de los caracteres especicados Empareja los caracteres en el rango especicado Empareja caracteres que no concuerdan con los especicados Empareja caracteres que no concuerdan con el rango especicado El nombre del usuario actual El nombre del usuario especicado El directorio de trabajo actual El directorio de trabajo anterior

3.

Alias

Facilita el uso de comandos permitiendo nombres abreviados para los comandos y sus argumentos comnmente usados.
alias name=commando options arguments

Donde command especica el comando para el cual se desea crear un alias. name especica el alias.
alias dir=ls -l alias fm=mount -t vfat /dev/fd0 /mnt/floppy alias fu=umount /mnt/floppy

Su conguracin por defecto probablemente dene varios alias, para listarlos:


alias

Si inicio sesin como administrador su lista puede ser:


alias alias alias alias alias alias cp=cp -i dir=ls -l cp=cp -i ls=ls --color mv=mv -i rm=rm -i

Para remover los alias use el comando unalias.


unalias name

4.

Scripts

Un script de shell es simplemente un archivo que contiene comandos, para posteriormente ser ejecutados una y otra vez. Por ejemplo considere un archivo denominado deleter, que contiene las siguientes lineas:
echo -n Eliminando archivos temporales ... rm -fr /tmp/* echo Done.

Para ejecutar este script:


sh deleter

Si se invoca el comando sh sin argumento que nombre a un script, se lanza una instancia del sesin anterior use el comando exit. Para facilitar la ejecucin del script cambie el acceso de ejecucin:
chmod ugo+x deleter ./deteler PATH/deleter deleter

SHELL

para retornar a la

Para ejecutar desde el directorio de trabajo. Para ejecutar siguiendo su ruta absoluta o relativa. Para ejecutar siguiendo la ruta de bsqueda.

Linux incluye varios script estndares que pueden ser ejecutados dependiendo del momento. /etc/prole ~/.prole ~/.bashrc Ejecutado cuando el usuario inicia sesin Ejecutado cuando el usuario inicia sesin. Ejecutado cuando el BASH es lanzado.

~/.bash_logout Ejecutado cuando el usuario abandona la sesin.

5.

Redireccionamiento
El SHELL proporciona tres ujos estndares: El ujo estndar de entrada El ujo estndar de salida El ujo estndar de errores

stdin stdout stderr

Por defecto, los programas leen su entrada desde el ujo stdin y escribe su salida al ujo stdout. Porque ambos ujos son normalmente asociados a las consolas (teclado y pantalla de consola respectivamente). El ujo stderr es asociado a la pantalla de la consola. Aunque el SHELL asocia por defecto los tres ujos de entrada/salida con la consola, se pueden especicar redirectores de entrada/salida que por ejemplo asocie una entrada o una salida con un archivo. > le 2> le > > le 2> > le &> le < le < < text Redirecciona el ujo de salida estndar al archivo especicado. Redirecciona el ujo de error estndar al archivo especicado. Redirecciona el ujo de salida estndar al archivo especicado, aadiendo salida al archivo si el archivo existe. Redirecciona el ujo de error estndar al archivo especicado, aadiendo salida al archivo si el archivo existe. Redirecciona el ujo de salida y error estndar al archivo especicado. Redirecciona el ujo de entrada estndar al archivo especicado. Lee el ujo de entrada estndar hasta encontrar el patrn text, en cuyo es interpreta como el nal del ujo.

cmd1 | cmd2 Se toma la entrada estndar del cmd2 desde la salida estndar de cmd1 (tambin conocido como canal de redireccin) Que hacen los comandos: 3

wc /etc/passwd wc /etc/passwd > total cat total wc wc < /etc/passwd

Muchos programas son escritos de modo que ignoren la redireccin. Por ejemplo el comando passwd. espera leer la contrasea nicamente desde la consola, no desde un archivo. Muchos programas Linux leen su entrada desde el ujo stdin y escriben su salida al ujo stdout, estos programas son denominados ltros. Estros programas pueden ser usados en conjunto para realizar complejas operaciones. La herramienta para combinar los ltros es el pipe, el cual conecta la salida de un programa a la entrada de otro.
ls -l ~ | wc -l

6.

Variables Shell

El SHELL es un lenguaje de programacin en sus propios teminos, permitiendo referirse a sus variables conocidas como variables shell o variables de entorno. Para asignar un valor a una variable shell use el siguiente esquema.
Variable=valor

Asigna el valor valor al la variable Variable. Las variables shell son ampliamente usadas dentro de Linux, porque proporciona una via para transferir datos de una comando a otro. Para listas todas las variables de entorno invoque al comando set. Los valores de esas variables son establecidas por scripts de inicio.
#!/bin/bash Nombre=Linux user.. echo "Hello:" echo $Nombre echo Algunas variables de entorno:

DISPLAY HOME

La vista X a ser usada: por ej. localhost:0 La ruta absoluta del home del usuario.

HOSTNAME El nombre del equipo. LOGNAME MAIL PATH SHELL TERM USER El alias del usuario. La ruta absoluta del buzn de correo del usuario. La ruta de bsqueda. La ruta absoluta del actual SHELL. El nombre del terminal. El nombre del usuario; diere del login si se ejecuto el comando su.

Se puede usar el valor de la variable shell precedindola por el signo $.


cd $HOME cd ${HOME}

Par imprimir el valor de una variable use la variable como argumento del comando echo.
echo $HOSTNAME

Para hacer disponible una variable de shell a otros programas invocados por el shell deben ser exportadas.
export Variable export VariableX=ValorY Variable= unset Variable

Para remover el valor asociado con la variable: Para eliminar la varible:

7.

La ruta de Bsqueda

La variable de entorno PATH contiene una serie de rutas separadas por : conocida como ruta de bsqueda. Cuando se invoca a un comando externo el SHELL usa la ruta de bsqueda para hallar el nombre de archivo que corresponde al comando. Los scripts de inicio establecen los valores iniciales para PATH, para modicar su valor redena la aadiendo al valor anterior las nuevas rutas:
PATH=${PATH}:/home/user

El comando which verica la ruta de bsqueda para el argumento indicado e imprime la ruta del nombre encontrado si existe.
which wc

8.

Entrecomillado
Permiten la correcta interpretacin para el SHELL. Caracteres incluidos dentro de un par de simple comillas son interpretados literalmente. Caracteres incluidos dentro de un par de doble comillas son interpretados literalmente. Adems se reemplazan las variables de entorno con el valor referenciado. Caracteres incluidos dentro de un par de comillas invertidas son interpretados como un comando el cual es ejecutado antes de ejecutar el resto de comandos de la linea. La salida del comando remplaza la cadena original. El siguiente carcter es interpretado literalmente. Se ignora los metacaracteres.

Interprete cada linea:


echo echo echo echo $PATH $PATH $PATH Mi directorio personal contiene ls ~ | wc -l Archivos.

Ejecute el siguiente programa


#!/bin/bash DIR=/tmp Cadena1="ls -l Cadena2=ls -l Cadena3=\$DIR Cadena4=ls -l echo echo "Cadena1: echo "Cadena2: echo "Cadena3: echo "Cadena4:

$DIR" $DIR $DIR "$Cadena1 "$Cadena2 "$Cadena3 "$Cadena4

Ahora puede apreciar el poder del SHELL de Linux: Incluyendo sus alias en el script de inicio .bashrc, usando el auto completado de comandos, usando la lista histrica. Pero el SHELL tiene caractersticas que extienden sus capacidades como la de incluir un lenguaje de programacin que proporciona el procesamiento de argumentos, condiciones, lgicas, bucles, subprogramas y recursividad.

9.

Procesando Argumentos
Cuando se llama a un programa (comando) se aade informacin adicional por ejemplo:
ls -l /tmp

este comando tiene dos parmetros: 1) -l 2) /tmp Los parmetros dentro de un script se recuperar con las variables especiales: $1, $2, ..., $9. Adems: $# Indica el numero de parmetros pasados al script. 5

$0

El nombre del script.

$1,$2,...,$9 Cada uno de los argumentos. $* $@ $? $$ Cadena con todos los parmetros, tratado como una palabra simple. Cadena con todos los parmetros, tratado como una serie de palabras. Cdigo de salida del comando previo. Un valor 0 seala que termino sin errores. El identicador de proceso.

Advierta que el shell le proporciona variables para acceder solo a nueve argumentos. Para acceder al resto de parmetros use el comando shift que descarta el primer parmetro y desplaza la lista hacia la izquierda. La variable $? contiene un cdigo de salida numrico del anterior comando. Por convencin un cdigo de 0 denota un termino sin errores; en cambio otros valores indican condiciones de error. Un script puede terminar indicando un cdigo de nalizacin con el comando:
exit status

donde status es un entero no negativo que indica el cdigo de salida. Invoque el siguiente script con dos parmetros
#!/bin/bash echo echo "El primer parametro: "$1 echo "El segundo parametro: "$2 echo "Numero de parametros es: "$# echo "El nombre del script es: "$0 echo "Los parametros son: "$* echo "Los parametros son: "$@ echo

10. Comparacin de Expresiones


La comparacin lgica de dos operadores (numricos o cadenas) tiene la sintaxis:
test expresion [ expresion ]

Comparacin de cadenas: s1 = s2 s1 != s2 -n s1 -z s1 Para comparar si dos cadenas son iguales. Para comparar si dos cadenas no son iguales. Para evaluar si la longitud de la cadena es mayor que cero. Para evaluar si la longitud de la cadena es cero.

Comparacin numrica: n1 -eq n2 n1 -ge n2 n1 -le n2 n1 -ne n2 n1 -gt n2 n1 -lt n2 igual que mayor o igual que menor o igual que no es igual que mayor que menor que

Operadores de archivos: -e le -d le -f le -c le -b le -r le -s le -w le -x le -h le f1 -nt f2 f1 -ot f2 existe existe y es directorio existe y es archivo existe y es un archivo de dispositivo de caracteres existe y es un archivo de dispositivo de bloques existe y tiene permiso de lectura existe y tiene longitud mayor a cero existe y tiene permiso de escritura existe y tiene permiso de ejecucin existe y es un enlace el archivo f1 es mas reciente que f2 el archivo f1 es mas antiguo que f2

Operadores lgicos: ! -a -o el operador NOT, invierte el valor de la siguiente condicin . el operador lgico AND el operador lgico OR

11. Evaluacin Aritmtica


Las variables SHELL pueden contener nmeros, pero en general todos son tratados como cadenas de caracteres. La aritmtica entera se puede manejar con el comando interno let o con el comando externo expr.
#!/bin/bash NUM=1024 let X=$NUM/16 Y=expr $NUM / 256 echo Calculo con let: $X echo Calculo con expr: $Y

El comando interno let exige que no se incluyan espacios entre los operandos y operadores; en cambio el comando externo expr exige espacios. Operadores matemticos let ++ - * /% < <= > >= == != &^|~ << > && || ! = *= /= %= += -= < <= >= &= ^= |= Operadores matemticos expr + - * /% < <= > >= = != &| suma, resta, multiplicacin divisin y resto comparaciones: menor que, menor o igual que, mayor que, mayor o igual que, igual, diferente operadores lgicos AND y OR 7 incremento y decremento suma, resta, multiplicacin divisin y resto comparaciones: menor que, menor o igual que, mayor que, mayor o igual que, igual, diferente AND, XOR, OR y NOT a nivel de bits desplazamiento a la izquierda y desplazamiento a la derecha a nivel de bits operadores lgicos AND, OR y NOT asignaciones

12. Sentencia if:


if [ expresion ] then fi if [ expresion ] then else fi if [ expresion ] then elif [ expresion ] else fi Codique e invoque con los parmetros apropiados los siguientes scripts:
#!/bin/bash if [ $1 -ge 0 ] ; then echo "El numero es positivo o nulo" fi #!/bin/bash if [ $1 -ge 0 ] ; then echo "El numero es positivo o nulo" else echo "El numero es negativo" fi #!/bin/bash if [ $1 -gt 0 ] ; then echo "El numero es positivo" elif [ $1 -eq 0 ] ; then echo "El numero es nulo" else echo "El numero es negativo" fi

13. Sentencia case


Es una sentencia de seleccin mltiple case str in str1) sentencias;; str2) sentencias;; *) sentencias;; esac Codique e invoque con un parmetro numrico:
#!/bin/bash case $1 in 1 | 01) echo 2 | 02) echo 3 | 03) echo 4 | 04) echo 5 | 05) echo 6 | 06) echo 7 | 07) echo 8 | 08) echo 9 | 09) echo 10) echo 11) echo 12) echo *) echo esac

"Mes de Enero";; "Mes de Febrero";; "Mes de Marzo";; "Mes de Abril";; "Mes de Mayo";; "Mes de Junio";; "Mes de Julio";; "Mes de Agosto";; "Mes de Septiembre";; "Mes de Octubre";; "Mes de Noviembre";; "Mes de Diciembre";; "Parametro invalido";;

14. Sentencia for


La sentencia for itera sobre los elementos de una lista: for var in lista do sentencias done
#!/bin/bash for Mes in 1 2 3 4 5 6 7 8 9 10 11 12 do cal $Mes 2004 done

Ejecute este script aadiendo una lista de parmetros


#!/bin/bash for Mes in "$@" do cal $Mes 2004 done

15. Sentencia while


Se ejecuta las sentencias mientras la expresin resulte verdadera while expresion do sentencias done
#!/bin/bash num=1 sum=0 while [ $num -le 5 ] do sum=expr $sum + $num num=expr $num + 1 done echo "La suma es: $sum"

16. La sentencia until


Se ejecuta las sentencias hasta que se cumpla la condicin until expresion do sentencias done #!/bin/bash
num=1 sum=0 until [ $num -gt 5 ] do sum=expr $sum + $num num=expr $num + 1 done echo "La suma es: $sum"

17. Otras sentencias


Sentencia break Se usa para salir de un bucle: for until o while Sentencia continue Sentencia exit Se usa para iniciar el siguiente ciclo de un bucle: for until o while

Se utiliza para salir de un script, puede tener ser acompaado de un parmetro de salida. 9

18. Funciones
Cuando se invoca a un subprograma: func param1 param2 param 3 un subprograma puede analizar los parmetros pasados de forma idntica a alas de un guin. func () { #sentencias } Ejemplo de subprograma:
#!/bin/bash MuestraMes() { case $1 in 1 | 01) echo 2 | 02) echo 3 | 03) echo 4 | 04) echo 5 | 05) echo 6 | 06) echo 7 | 07) echo 8 | 08) echo 9 | 09) echo 10) echo 11) echo 12) echo *) echo esac } MuestraMes 8

"Mes de Enero";; "Mes de Febrero";; "Mes de Marzo";; "Mes de Abril";; "Mes de Febrero";; "Mes de Mayo";; "Mes de Junio";; "Mes de Agosto";; "Mes de Septiembre";; "Mes de Octubre";; "Mes de Noviembre";; "Mes de Diciembre";; "Parametro invalido";;

Imprime una pagina que indiza las paginas html de cada subdirectorio.
#!/bin/bash echo <html> echo <head> echo <title> My Index </title> echo </head> echo <body> echo <h1>Index of HTML files </h1> for i in * do if [ -d $i ] ; then echo "<h2>$i</h2>" echo <ul> for j in $i/*.htm* do if [ -f $j ] ; then tline=grep <TITLE> $j if [ $? -eq 1 ] then ntitle=basename $j | cut -f1 -d"." else ntitle=echo $tline | sed s/^.*<title>// | sed s/<\/title>.*$// fi echo "<li><a href=$j>$ntitle</a>" fi done echo </ul> fi done echo </body> echo </html>

Programa que muenta un cdrom:


#!/bin/ash PM=/dev/hda PS=/dev/hdb SM=/dev/hdc SS=/dev/hdd DEVICES="$PM $PS $SM $SS /dev/sr0" DEVCD= #Montar el CDROM if [ ! -d /cdrom ] ; then

10

mkdir /cdrom fi for DEV in $DEVICES do echo $DEV mount -t iso9660 $DEV /cdrom 2> /dev/null if [ $? -eq 0 ] ; then DEVCD=$DEV ln -s $DEV /dev/cdrom 2>/dev/null break fi done if [ -z $DEVCD ] ; then echo "CDrom no Encontrado ..." exit 1 fi

Programa que carga al PostgreSQL


#! /bin/sh PG_SYSCONFIG=/etc/sysconfig/postgresql if [ -f $PG_SYSCONFIG ]; then # SuSE Linux 8.0 and above . $PG_SYSCONFIG else # SuSE Linux up to 7.3 . /etc/rc.config base=${0##*/} link=${base#*[SK][0-9][0-9]} test $link = $base && START_POSTGRES=yes test "$START_POSTGRES" = yes || exit 0 fi # Shell functions sourced from /etc/rc.status: # rc_check check and set local and overall rc status # rc_status check and set local and overall rc status # rc_status -v ditto but be verbose in local rc status # rc_status -v -r ditto and clear the local rc status # rc_failed set local and overall rc status to failed # rc_reset clear local rc status (overall remains) # rc_exit exit appropriate to overall rc status . /etc/rc.status H=/usr/bin/postmaster test -x $H || exit 5 LOGFILE=/var/log/postgresql eval DATADIR=${POSTGRES_DATADIR:-~postgres/data} OPTIONS=${POSTGRES_OPTIONS} # The echo return value for success (defined in /etc/rc.config). rc_reset # Return values acc. to LSB for all commands but status: # 0 - success # 1 - generic or unspecified error # 2 - invalid or excess argument(s) # 3 - unimplemented feature (e.g. "reload") # 4 - insufficient privilege # 5 - program is not installed # 6 - program is not configured # 7 - program is not running # # Note that starting an already running service, stopping or restarting a not-running # service as well as the restart with force-reload (in case signalling is not supported) # are considered a success. case "$1" in start) if [ ! -f $DATADIR/PG_VERSION ]; then echo -n "Initializing the PostgreSQL database at location ${DATADIR}" install -d -o postgres -g daemon -m 700 ${DATADIR} && su - postgres -c "env -i initdb $DATADIR &> initlog" || rc_failed rc_status -v rc_status || { echo "You can find a log of the initialisation in ~postgres/initlog." rc_exit } fi echo -n "Starting PostgreSQL" BIN_VERSION=$(/usr/bin/postgres --version|sed s/.* \([0-9]\+\.[0-9]\+\).*/\1/) DATA_VERSION=$(cat $DATADIR/PG_VERSION) if [ "$BIN_VERSION" != "$DATA_VERSION" ]; then echo "" echo " Installed binaries and database files dont match." echo " Manual work is needed to upgrade your database." echo " See /usr/share/doc/packages/postgresql/README.SuSE for details." echo -n "Starting PostgreSQL "

11

rc_failed rc_status -v rc_exit else ## remove old socket, if it exists and no daemon is running. checkproc $H || rm -f /tmp/.s.PGSQL.5432 ## Start daemon with startproc(8). If this fails ## the echo return value is set appropriate. /sbin/startproc -e -t 1 -u postgres -l $LOGFILE $H $OPTIONS -D$DATADIR rc_status -v fi ;; stop) echo -n "Shutting down PostgreSQL" ## Stop daemon with killproc(8) and if this fails ## set the echo return value. killproc -INT $H rc_status -v ;; try-restart) ## Stop the service and if this succeeds (i.e. the ## service was running before), start it again. ## Note: try-restart is not (yet) part of LSB (as of 0.7.5) $0 status && $0 restart ;; restart) ## Stop the service and regardless of whether it was ## running or not, start it again. $0 stop $0 start rc_status ;; force-reload | reload) echo -n "Reloading configuration for PostgreSQL" killproc -HUP $H rc_status -v ;; status) echo -n "Checking for PostgreSQL: " ## Check status with checkproc(8), if process is running ## checkproc will return with exit status 0. # Status has a slightly different for the status command: # 0 - service running # 1 - service dead, but /var/run/ pid file exists # 2 - service dead, but /var/lock/ lock file exists # 3 - service not running # NOTE: checkproc returns LSB compliant status values. checkproc $H rc_status -v ;; probe) rc_failed 3 rc_status -v ;; *) echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" exit 1 ;; esac # Inform the caller not only verbosely and set an exit status. rc_exit

12

También podría gustarte