Está en la página 1de 14

casidiablo.blogspot.

com
Programacin Shell en Linux
El turno ahora es para los intrpretes de comandos de Linux y su programacin, conocida
como programacin shell. Aunque el intrprete de comandos es independiente del
lenguaje de programacin utilizado, Linux permite crear programas utilizando
caractersticas propias de cada un de los shell existentes.
como, no hay solo un intrprete !mm, nop" hay #astantes shells para Linux$o
intrpretes de comandos o consolas o como lo llames %de ahora en adelante shell&'. (o
como en )indo)s que tan solo tiene el interprete de *+, $o cmd o command'.
-omo ha#r.s podido deducir la programacin en shell es /interpretada0, no compilada,
lo que reduce el desempe1o del sistema" pero la 2entaja es la 3acilidad de creacin y
mantencin.
Los temas a 2er ser.n los siguientes4
5u es un shell y 5u shells est.n disponi#les
6rincipios de los shells $redireccin'
7aria#les de entorno
6rocesamiento en segundo plano
-ompletacin y sustitucin de comandos $sustitucin y creacin del alias'
,ecuencias de comandos de los shell
Qu es shell
!nos dicen que es el sistema operati2o, otros dicen que es una pantalla negra sin sentido
y anticuada, otros dicen que es la causa de que Linux no sea 3amosa entre gente
inexperta. quien tiene la razn 8agan sus apuestas999 (o, ahora en serio.
(+ es el sistema operati2o $el sistema operati2o es el so3t)are que dirige la
computadora, ha#la con el hard)are, carga y ejecuta programas, etc.'" cuando se 2e el
indicador de la computadora y se escri#en comandos para ejecutar, con lo que estamos
tratando es con el shell.
!na caracterstica interesante de Linux, es que los shells son completamente
independientes. -omo usuario tenemos la libertad de elegir entre uno u otro shell.
:am#in es posi#le interactuar con un shell, y escri#ir comandos para otro.
Shells disponibles en Linux
6iensa que el shell es un programa que est. entre el usuario y el sistema operati2o. Este
programa interpreta lo que el usuario le indica $en su lenguaje' para manipular el
sistema operati2o.
por Cristian Castiblanco
casidiablo.blogspot.com
El shell original disponi#le en los sistemas !(;< era el shell =ourne $/sh0'. *espus dos
shells que se 2ol2ieron populares 3ueron shell >orn $/?sh0' y el el shell - $/csh0', cada
uno con sus caractersticas propias, 2entajas y des2entajas.
Los shells =ourne y el - 3ueron reescritos, como resultado ahora tenemos el /=ourne
again shell $,hell =ourne nue2amente'0 o /#ash0, y el shell : $/tcsh0'. Los tres shells
est.n disponi#les en casi todas las distros de Linux. =ash es pro#a#lemente el shell m.s
utilizado actualmente, y es el que 2iene por de3ecto en la mayora de las distros.
Principios de los shell
Operacin de los shell y conceptos bsicos de sintaxis
El shell es un programa que nos permite interactuar con el sistema operati2o. La /lnea
de comandos0 es la entrada del usuario para el shell. El shell examina la lnea de
comandos, 2eri3ica que lo que se ha escrito es correcto, determina si se ha digitado el
nom#re de un programa $un programa #inario o compilado', y de ser as en2ia dicho
programa al n@cleo $?ernel' para su ejecucin.
:odos los comandos shell utilizan el siguiente 3ormato4
comando opcion1 opcion2 opcion3 ... opcionN argumento1 argumento2 ... argumentoN
Esta lnea se conoce como lnea de comandos" que consiste en un comando y una o m.s
opciones $yAo argumentos'. 6or lo general el espacio en #lanco se ignora. En Linux los
comandos son sensi#les al uso de may@sculas y min@sculas, cosa que no pasa en
Bindo)s. El comando se termina pulsando la tecla Enter" aunque se puede continuar el
comando en una nue2a lnea usando #ac?slash $C'.
comando-largisisisisisisisimo opcion1 opcion2 opcion3 ... opcionN \
argumento1 argumento2 ... argumentoN
Adem.s es posi#le concatenar 2arios comandos, separ.ndolos con punto y coma $"', por
ejemplo4
clear; pwd; ls
Redireccin de E/S
-uando se ejecuta un programa en Linux se a#re autom.ticamente tres archi2os $3lujos'
de EA, para ellos. Estos son4 la entrada estndar, la salida estndar y el error estndar.
Aunque parezca con3uso todos los sistemas !(;< utilizan este sistema, #asado en el
manejo de archi2os. 6or ejemplo, si deseas en2iar datos a tu disco extrai#le de#es
en2iar los datos al archi2o asociado con dicho pendri2e, por lo general Ade2AsdaD.
por Cristian Castiblanco
casidiablo.blogspot.com
6or de3ecto la salida est.ndar est. conectada a la pantalla, la entrada de est.ndar al
teclado, y el error est.ndar a la pantalla. Es posi#le reasignar estos destinos antes de
ejecutar el programa, en lo que se conoce como redireccin de EA,.
,upongamos que queremos crear una lista de archi2os del directorio AusrAinclude, pero
que dichos archi2os contengan la pala#ra /Einclude0. !na 3orma sencilla de hacer esto
sera4
grep -l #include /usr/include/*.h > ListaArchivos
grep compro#ar. los archi2os de la carpeta AusrAli# cuya extensin sea F.h y
determinar. cuales de ellos contienen la pala#ra /Einclude0. El car.cter G es el que
indica la redireccin de salida" esto ocasiona que el shell redireccione la salida est.ndar
a el archi2o ListaArchi2os. Los nom#res que est.n en el archi2o se 2er.n as4
/usr/include/GUI.h
/usr/include/Float.h
/usr/include/Redirect.h
/usr/include/nvu.h
/usr/include/bluefish.h
6ara reemplazar, por ejemplo, la cadena AusrAinclude al principio de cada archi2o
puedes utilizar el comando sed4
sed 's#^/usr/include/##' < ListaArchivos > ListaArchivoss
El comando sed opera so#re los datos de entrada est.ndar, as que en este caso
utilizamos el car.cter H para redireccionar la entrada. En lugar de leer del teclado, esta
2ez leer. de un archi2o. *espus, la salida del comando sed se redirige hacia el archi2o
ListaArchi2oss.
6ero, cmo se redirige el error est.ndar 6ara redirigir el error est.ndar se utiliza >&,
por ejemplo4
sed 's#^/usr/include/##' < ListaArchivos >& ErrorSed > SalidaSed
+ se puede redirigir tanto el error est.ndar, como la salida est.ndar as4
sed 's#^/usr/include/##' < ListaArchivos >& Salida
uber!as
!na 3orma relacionada con la redireccin se conoce como tu#era. 6artamos del ejemplo
anterior" ya no solo quiero los archi2os sino adem.s los quiero ordenados
al3a#ticamente. 6odriamos utilizar la redireccin as4
por Cristian Castiblanco
casidiablo.blogspot.com
grep -l #include /usr/include/*.h > ListaArchivos
sort ListaArchivos > ListaOrdenada
Importante!!!
El comando sort ListaArchivos > ListaOrdenada en ningn momento utiliza
redireccin de entrada. Algunos comandos como sort reciben directamente el nombre de
un archivo como argumento, que es distinto a redireccionar la entrada; esto se conoce
como iltro.
+#2iamente de#e ha#er una manera m.s e3iciente de hacer sta operacin, es decir, sin
usar dos comandos ni un archi2o temporal. 6or ejemplo4
grep -l #include /usr/include/*.h | sort > ListaOrdenada
El car.cter de tu#era $I' encadena dos comandos y conecta $redirecciona' la salida
est.ndar del primero, a la entrada del segundo. !na sola lnea de comandos puede tener
cualquier n@mero de tu#eras4
grep -l #include /usr/include/*.h | sort | sed 's#^/usr/include/##' >
ListaModificadaOrdenada
"ariables de entorno
(ormalmente los programas utilizan 2aria#les para poder lle2ar a ca#o determinadas
acciones. 6or ejemplo los editores como 2i o emacs necesitan sa#er en que tipo de shell
se et.n ejecutando. Est. in3ormacin podra ser cargada mediante el uso de argumentos
al momento de ejecutar un comando, pero dicha tarea sera m.s que tediosa para el
usuario, ya que se tendra que hacer cada 2ez que se ejecute el comando.
Los shell solucionan estos pro#lemas con las 2aria#les de entorno. !na 2aria#le de
entorno es simplemente un par nom#reA2alor. El shell hace una lista de 2aria#les y las
mantiene disponi#les para cualquier programa que se ejecute so#re l. Existen dos tipos
de 2aria#les4 las 2aria#les normales de shell $2aria#les locales', y las 2aria#les de
entorno $2aria#les glo#ales'.
6ara esta#lecer una 2aria#le de entorno se utiliza el comando4
export NOMBRE=valor
,i el 2alor de la 2aria#le incluye espacios en #lanco es posi#le encerrar dicho 2alor entre
comillas do#les o sencillas, para e2itar con3lictos. 6or ejemplo4
export JAVAPATH="/usr/lib/programas instalados/maquina virtual"
:am#in es posi#le agregar nue2os 2alores a una 2aria#le ya existente, para ello
podemos utilizar la siguiente sintaxis4
export JAVAPATH="$JAVAPATH otro_valor"
por Cristian Castiblanco
casidiablo.blogspot.com
Esto agrega la cadena JotroK2alorJ a la 2aria#le LA7A6A:8. 6uedes 2er el 2alor de una
2aria#le con el comando echo, as4
echo $PATH
:am#in es posi#le 2er las 2aria#les disponi#les de una manera sencilla. *igitamos el
comando Jecho MJ y despus pulsamos dos 2eces la tacla :A=. 7er.s algo como esto4
ubuntu@ubuntu:~$ echo $
$_ $GDM_XSERVER_LOCATION $OSTYPE
$BASH $GNOME_DESKTOP_SESSION_ID $PATH
$bash205 $GNOME_KEYRING_SOCKET $PIPESTATUS
$bash205b $GROUPS $PPID
$bash3 $GTK_RC_FILES $PROMPT_COMMAND
$BASH_ARGC $HISTCMD $PS1
$BASH_ARGV $HISTCONTROL $PS2
$BASH_COMMAND $HISTFILE $PS4
$BASH_COMPLETION $HISTFILESIZE $PWD
$BASH_COMPLETION_DIR $HISTSIZE $RANDOM
$BASH_LINENO $HOME $RUNNING_UNDER_GDM
$BASH_SOURCE $HOSTNAME $SECONDS
$BASH_SUBSHELL $HOSTTYPE $SESSION_MANAGER
$BASH_VERSINFO $IFS $SHELL
$BASH_VERSION $LANG $SHELLOPTS
$COLORTERM $LESSCLOSE $SHLVL
$COLUMNS $LESSOPEN $SSH_AGENT_PID
$COMP_WORDBREAKS $LINENO $SSH_AUTH_SOCK
$DBUS_SESSION_BUS_ADDRESS $LINES $TERM
$DESKTOP_SESSION $LOGNAME $UID
$DESKTOP_STARTUP_ID $LS_COLORS $USER
$DIRSTACK $MACHTYPE $USERNAME
$DISPLAY $MAILCHECK $WINDOWID
$EUID $OPTERR $XAUTHORITY
$GDMSESSION $OPTIND
"ariables utili#adas por el shell
8a#lemos de algunas de las 2aria#les m.s utilizadas por el shell4
!I"#$A%4 Esta 2aria#le la leen los programas < para sa#er donde desplegar su salida.
+jo999 con programas < me re3iero a programas gr.3icos, nada de porno, ehh4
6EN7EN:;*+999 6or lo general se esta#lece en J4O.OJ, lo que signi3ica que la salida se
desplegar. en la primera terminal gr.3ica $2irtual' del equipo 8+,:.
#A&'4 -ontiene una lista de nom#res de directorios separados por el signo dos puntos J4J.
-uando digitamos el nom#re de alg@n comando, el shell #usca entre dichos directorios
un programa con dicho nom#re. ,i no lo encuentra aparece algo como esto4 J#ash4
?ill#illgates4 command not 3oundJ.
por Cristian Castiblanco
casidiablo.blogspot.com
&E()4 El tipo de terminal o emulacin del terminal. Los programas como los editores
de#en sa#er so#re qu tipo de terminal se est.n ejecutando para poder manipular
correctamente la pantalla y el cursor.
'*)E4 El directorio personal del usuario actual.
:am#in existen 2aria#les que el shell mismo esta#lece, por ejemplo la 2aria#le 6B* es
actualizada constantemente por el shell y guarda el @ltimo directorio re3erenciado por
el comando cd.
Procesamiento en segundo plano$ suspencin y control de procesos
6or lo general cuando ejecutamos un comando esperamos a que termine para seguir con
el prximo. 6ero, supongamos que el comando que ejecutamos podra tardar #astante
tiempo $tal 2ez es una operacin de #@squeda, o est. copiando un archi2o muy pesado',
la solucin inmediata sera a#rir otra terminal y seguir tra#ajando no
=ien, pues existe una 3orma m.s JeleganteJ de hacer las cosas, y es utilizando la
naturaleza multitarea de Linux. Es posi#le ejecutar un comando en segundo plano con el
car.cter especial JPJ. 6or ejemplo, deseo crear una lista +N*E(A*A de los archi2os con
la extensin F.so que hay en mi computador, entonces hara algo como esto4
debianita:/# find . -name '*.so' -print | sort >ListaOrdenada &
[1] 4647
debianita:/#
El shell imprime J%D& QRQSJ y regresa inmediatamente, es decir, la shell queda lista para
reci#ir comandos de nue2o. La salida indica que se est. ejecutando una tarea en
segundo plano, y que el 6;* $identi3icador de proceso' es QRQS. En este caso el proceso
es el n@mero D en la cola de procesamiento en segundo plano.
,i se ejecuta un proceso sin el comando P el shell espera a que dicha tarea termine
antes de pedirte un nue2o comando. En ese caso se dice que la tarea se est. ejecutando
en primer plano.
,i te 2as a casar y en plena #oda te das cuenta de que la est.s cagando, lo m.s pro#a#le
es que ya no puedas hacer nada $condenado est.s'. 6ero Linux es m.s 3lexi#le que el
matrimonio, si has ejecutado un comando en segundo plano y te arrepientes puedes
traerlo $desde el mundo espectral' Jal primer planoJ con el comando 3g.
,i ya est.s casado y quieres tomarte un descanso, conocer m.s gente $mujeres' y dejar
suspendido el matrimonio un rato, pues te jodes porque tu mujer de seguro no te deja.
Linux piensa m.s en ti que tu mujer, si est.s ejecutando un comando en primer plano
puedes suspenderlo, sin eliminarlo completamente. 6ara ello de#es oprimir J-trlTUJ, con
lo cual el proceso quedar. suspendido4
por Cristian Castiblanco
casidiablo.blogspot.com
debianita:/# find . -name '*.so' -print | sort > ListaOrdenada
[1]+ Stopped find . -name '*.so' -print | sort >ListaOrdenada
debianita:/#
6uedes JdescongelarJ el proceso y traerlo al primer plano con el comando 3g, o
descongelarlo pero dejarlo en segundo plano con el comando #g. !mm, si el matrimonio
3uera como Linux... en 3in.
Ahora, por @ltimo si quieres aca#ar con el matrimonio recurres al di2orcio, pero despus
2iene la separacin de #ienes, la demanda por alimentos, y tu mujer te deja en la calle.
*e nue2o, Linux piensa m.s en ti y aunque lo utilices eres m.s li#re que Junas monjitas
3ujiti2asJ. ,i deseas eliminar un proceso completamente puedes utilizar el comando ?ill,
indicando el 6;* del proceso $?ill QRQS', o por su lugar en la cola de procesamiento en
segundo plano $?ill VD'.
,i deseas sa#er que tareas se est.n ejecutando en segundo plano puedes utilizar el
comando jo#s. La siguiente imagen muestra el comportamiento de una sesin de
ejemplo, en la que se utilizan los comandos mencionados anteriormente.
por Cristian Castiblanco
casidiablo.blogspot.com
%ompletacin y sustitucin de comandos
#ash incluye mecanismos de a#re2iatura para reducir la cantidad de escritura que
hacemos. !na de ellas es la completacin de comandos, en la cual #ash trata de adi2inar
el comando que 2as a digitar.
6or ejemplo al digitar unos de los primeros caracteres de un comando, y presionar :a#,
#ash intenta adi2inar que comando quieres escri#ir" si est. completamente seguro #ash
completar. el comando por t, de lo contrario sonar. un J=eepJ, pulsa de nue2o :a# y
#ash desplegar. una lista de los posi#les comandos que tu quieres. 6or ejemplo4
casidiablo@debianita:~$ apt
apt-cache apt-config apt-ftparchive aptitude apt-sortpkgs
apt-cdrom apt-extracttemplates apt-get apt-key
El mismo mecanismo 3unciona si se est. digitando el nom#re de un archi2o o directorio.
6or ejemplo si escri#es Jls AuJ y presionas :a#, #ash completar. el comando y quedar.
as4 Jls AusrAJ.
El shell tam#in permite otros mtodos para ahorrarse la escritura, por ejemplo los
mecanismos de sustitucin. ,e permite 2arios tipos de sustituciones.
Sustitucin mediante comodines
Existen dos tipos de caracteres comodines importantes, el primero de ellos es el
asterisco $F', que representa cero o m.s caracteres de un nom#re de archi2o, y el signo
de interrogacin $' que representa cualquier car.cter indi2idual.
como se utiliza seguramente ya lo hayas 2isto en muchos lados, por ejemplo cuando
queremos listar todos los archi2os 3uente de -, lo hacemos con la instruccin Jls F.cJ lo
que le indica al shell que #usque cualquier archi2o que termine con .c, e ignora por
completo el n@mero de caracteres al principio o su 2alor.
:al2ez quisieras 2er todos los nom#res de los archi2os de - que tengan solamente Q
letras antes de la extensin, en ese caso utilizariamos el comando Jls .cJ. En #ash la
sustitucin de caracteres es m.s ro#usta que en *+,, y no tiene pro#lemas en expandir
Jade3Fg.cppJ a una lista de archi2os que empiezen con la letra WaW seguida de dos
caracteres cualesquiera, seguidos por de3, por cero o m.s caracteres, por WgW y terminen
con la extencin J.cppJ.
Sustitucin mediante cadenas
#ash permite la sustitucin de secuencias espec3icas de caracteres. 6uedes especi3icar
una lista separada por comas de cadenas entre lla2es, y cada una se utilizar. en orden.
por Cristian Castiblanco
casidiablo.blogspot.com
6or ejemplo4
casidiablo@debianita:~$ ls a{b,c,de,fgh}z
abz acz adez afghz
casidiablo@debianita:~$
Las letras a y z se com#inan con cada una de las cadenas entre las lla2es4 primero con #,
luego con c, luego con de y luego con 3gh.
Sustitucin mediante la salida de un comando
+tra 3orma de sustitucin es mediante la salida de un comando. La salida de un comando
se puede especi3icar como argumento a otro comando4
bash# ls -l 'find /usr/src -name Makefile -print'
Este ejemplo ejecutar. el comando 3ind para localizar todos los archi2os ma?e que estn
en el .r#ol de directorio AusrAsrc. La lista de archi2os se presentar. en la lnea de
comandos a ls, el cual mostrar. las entradas en el directorio de estos archi2os.
&istorial y edicin de comandos
#ash mantiene una lista de los comandos que has escrito, en lo que se conoce como
historial de comandos. 6or ejemplo, si escri#es una serie de comandos, y deseas
ejecutar uno de ellos otra 2ez, no es necesario 2ol2erlo a escri#ir, puedes #uscarlo
presionando la tecla Jarri#aJ $la de la 3lechita'. 6or lo general el tama1o de esta lista es
de XOO comandos su3iciente no
:am#in tenemos la opcin de 2er los comandos que se han escrito con la instruccin
history, por ejemplo4
casidiablo@debianita:/media/documentos/archivos$ history
1 g++
2 ci
3 ls
4 mkdir /media/hda2
5 sudo mkdir /media/hda2
6 ls
7 echo $PATH
8 ls -a
9 history
6ara in2ocar cualquier comando anterior, digita un signo de admiracin y el n@mero del
comando. 6ara repetir el comando echo M6A:8 $por ejemplo', escri#e 9S as4
casidiablo@debianita:/media/documentos/archivos$ !7
echo $PATH
/home/casidiablo/mono-1.1.13.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11
por Cristian Castiblanco
casidiablo.blogspot.com
Es posi#le repetir el @ltimo comando con 99. :am#in puedes editar una lnea de
comandos anterior antes de repetirla. ,upongamos que hemos escrito el comando ls Yl
A!,NAli#. 6ara corregir este comando y repetirlo, podriamos escri#ir Z!,NZusrZ. #ash da
por hecho que queremos editar el comando anterior y procede con la sustitucin, de ser
posi#le.
%reacin de alias de comandos
6ro#a#lemente utilices con 3recuencia ciertos comandos o secuencias de los mismos. Es
posi#le crear nuestros propios comandos utilizando lo que se conoce como alias. El shell
reemplazar. el alias con su de3inicin.
6or ejemplo, el comando ls lista los archi2os y directorios de una carpeta. -on la opcin
Ya muestra tam#in los archi2os ocultos, y con la opcin Y[ a1ade un asteristo $F' a los
archi2os ejecuta#les y un slash $A' a los directorios. 6uedes crear un alias para dicho
comando de la siguiente manera4
casidiablo@debianita:~$ ls
Desktop mono-1.1.13.8 mono-1.1.13.8_0-installer.bin
casidiablo@debianita:~$ ls -a -F
./ .gconf/ mono-1.1.13.8/
../ .gconfd/ mono-1.1.13.8_0-installer.bin*
.bash_history .gimp-2.2/ .mozilla/
.bash_logout .gksu.lock .nautilus/
.bash_profile .gnome/ .recently-used
.bashrc .gnome2/ .themes/
.bitrock/ .gnome2_private/ .thumbnails/
Desktop/ .gstreamer-0.10/ .viminfo
.dmrc .gtkrc-1.2-gnome2 .Xauthority
.evolution/ .ICEauthority .xine/
.face .icons/ .xsession-errors
.fontconfig/ .metacity/
casidiablo@debianita:~$ alias lss="ls -a -F"
casidiablo@debianita:~$ lss
./ .gconf/ mono-1.1.13.8/
../ .gconfd/ mono-1.1.13.8_0-installer.bin*
.bash_history .gimp-2.2/ .mozilla/
.bash_logout .gksu.lock .nautilus/
.bash_profile .gnome/ .recently-used
.bashrc .gnome2/ .themes/
.bitrock/ .gnome2_private/ .thumbnails/
Desktop/ .gstreamer-0.10/ .viminfo
.dmrc .gtkrc-1.2-gnome2 .Xauthority
.evolution/ .ICEauthority .xine/
.face .icons/ .xsession-errors
.fontconfig/ .metacity/
casidiablo@debianita:~$
Ahora hemos creado un nue2o comando llamado lss que har. la misma tarea de Jls Ya Y[J.
:am#in es posi#le sustituir un comando, por ejemplo, pudimos ha#er hecho4 alias ls\Jls
por Cristian Castiblanco
casidiablo.blogspot.com
Ya Y[J, sin ning@n pro#lema.
+ota, Es necesario el uso de las comillas, -a que sin ellas el comando alias intentar.a
usar el /a - el /0 como una opcin de s. mismo.
Secuencia de comandos de los shells
,e pueden colocar secuencias de comandos dentro de un archi2o para que dichos
comandos se ejecuten en cualquier momento. Es lo mismo que hacer un programa, con
la di3erencia de que los comandos ser.n interpretados es decir, no se compila el 3ichero.
El shell posee muchas caractersticas de un lenguaje de programacin normal, como
2aria#les e instrucciones de control.
-asi todas las secuencias de comandos empiezan con E9A#inAsh. Los primeros caracteres
indican al sistema que dicho archi2o es una secuencia de comandos, y A#inAsh inicia el
shell #ash. Esto es as ya que podemos indicar que el programa se ejecute con otro shell
$tcsh, ?sh, etc.' o programa interprete. 6or ejemplo, si se crea un programa en perl es
necesario iniciar con la lnea4 E9AusrA#inAperl. !na 2ez iniciado el shell indicado, ste
ejecuta una a una las lneas restantes del archi2o.
Las secuencias de comandos de shell de#en tener encendido su #it de permiso de
/ejecucin0. 6uedes encender dicho #it con el comando4 chmod aTx nom#rearchi2o.
"ariables
]a hemos ha#lado so#re las 2aria#les del shell. -uando se est.n ejecutando una
secuencia de comandos, ya est.n de3inidas algunas 2aria#les @tiles4
MM4 El identi3icador del proceso que se est. ejecutando.
MO4 El nom#re de la secuencia de comandos.
MD hasta M^4 Los primeros ^ argumentos de lnea de comandos que se pasan a la
secuencia de comandos.
ME4 El n@mero de par.metros de lnea de comandos que se pasan a la secuencia
de comandos.
Estructuras de control
#ash soporta la mayora de las instrucciones de control utilizadas en los lenguajes de
programacin comunes, aunque la sintaxis cam#ia un poquitn. Ahora 2amos a 2er un
ejemplo de una secuencia de comandos en las que se demuestra el uso de casi todas las
instrucciones de control disponi#les en #ash4
#!/bin/bash
#el nombre de este archivo debe ser programa.sh
por Cristian Castiblanco
casidiablo.blogspot.com
MAX=9
#Uso de la instruccin if
if [ $# -gt $MAX ]
then
echo "$0: $MAX o menos argumentos requeridos"
exit 1
fi
#Imprimir los dos primeros argumentos
echo "$0 : El argumento 1 es $1"
echo "$0 : El argumento 2 es $2"
echo ""
#Uso del for
for i in $1 $2
do
ls -l $i;
done
echo ""
#Uso de la intruccin case
echo "ejemplo case"
for i
do
case "$i" in
archivo1) echo "caso a";;
archivo2) echo "caso b";;
*) echo "Este es el famoso default: $i";;
esac
done
echo ""
#Uso de la instruccin while-done
echo "ejemplo while-done"
i=1;
#mientras que $i sea menor al nmero de argumentos
while [ $i -le $# ]
do
echo $i;
i=$[$i+1];
done
echo "";
#Uso de la instruccin until-done
echo "ejemplo until"
i=1;
#hasta que $i sea mayor al nmero de argumentos
until [ $i -gt $# ]
do
echo "$i argumentos se balanceaban sobre la tela de una araa";
i=$[$i+1];
done
echo ""
exit 0
por Cristian Castiblanco
casidiablo.blogspot.com
La lnea J_A<\^J esta#lece una 2aria#le llamada _A< y le asigna el 2alor entero ^.
Luego, el #loque i3Y3i comprue#a si el n@mero de argumentos es mayor de ^, en cuyo
caso imprime un mensaje de error y a#orta el programa.
Las instrucciones echo se utilizan para imprimir en pantalla. El shell entiende que
cuando se presenta algo como4 echo Jalgo MDJ, no de#e imprimir Jalgo MDJ sino Jalgo
primerargumentoJ, es decir, reconoce las 2aria#les dentro de cadenas de texto $como
perl o php'.
Las siguientes agrupaciones de comandos muestran el uso de las instrucciones de control
disponi#les en shell. La primera de ellas es el 3orYdone $equi2alente a 3or en -A-TT o
La2a'. Es interesante 2er que adem.s de imprimir 2alores con echo, es posi#le utilizar
comandos del shell, en este caso se toman los dos primeros argumentos y se utilizan
para completar el comando ls Yl.
*espus, en el uso del case $equi2alente al s)itchYcase de - o La2a', podemos o#ser2ar
el uso de esta instruccin de seleccin. En el ejemplo de )hile, se imprime la cantidad
de argumentos proporcionados al programa" igualmente actua la instruccin until. [jate
tam#in que es posi#le utilizar comentarios con el signo numeral $E, almohadilla para
los espa1oletes'.
!n ejemplo completo para la utilizacin de este programa sera4
casidiablo# touch archivo1 archivo2
casidiablo# ls -F
archivo1 archivo2 programa.sh(*)
casidiablo# ./programa.sh archivo1 archivo2 arg3 arg4 arg5 arg6 arg7 arg8 arg9
arg10
./programa.sh: 9 o menos argumentos requeridos
casidiablo# ./programa.sh archivo1 archivo2 arg3 arg4 arg5
./programa.sh : El argumento 1 es archivo1
./programa.sh : El argumento 2 es archivo2
-rw-r--r-- 1 casidiablo casidiablo 0 2007-02-10 14:16 archivo1
-rw-r--r-- 1 casidiablo casidiablo 0 2007-02-10 14:16 archivo2
ejemplo case
caso a
caso b
Este es el famoso default: arg3
Este es el famoso default: arg4
Este es el famoso default: arg5
ejemplo while-done
1
2
3
4
5
ejemplo until
por Cristian Castiblanco
casidiablo.blogspot.com
1 argumentos se balanceaban sobre la tela de una araa
2 argumentos se balanceaban sobre la tela de una araa
3 argumentos se balanceaban sobre la tela de una araa
4 argumentos se balanceaban sobre la tela de una araa
5 argumentos se balanceaban sobre la tela de una araa
casidiablo#
6rimero creamos dos archi2os 2acios con el comando Jtouch archi2oD archi2o`J. -on el
comando ls Y[ compro#amos que existen dichos archi2os m.s el programa $programa.sh'.
6uedes pro#ar pasarle m.s de ^ argumentos, para compro#ar que el i3 que colocamos el
principio de 2erdad 3unciona. Luego se in2oca el programa con X argumentos, los dos
primeros son los nom#res de los archi2os creados antes.
=ien eso es todo, si deseas aprender m.s acerca de este mara2illoso mundo del shell y
de Linux el mejor sitio para #uscar es mi )e# <*, es #roma, el mejor sitio es aoogle.
,aludos999
1223 Esta obra est ba4o la licencia de
2reative 2ommons (econocimiento/
2ompartirIgual. 0uentes empleadas son
propiedad de sus respectivos due5os.
por Cristian Castiblanco

También podría gustarte