Shell Scripts
Shell Scripts
Un script no es ms que fichero de texto que contiene una serie de instrucciones y rdenes que se ejecutarn en la lnea de comandos de forma seguida. Estas rdenes funcionaran de la misma manera si las fusemos introduciendo en la lnea de comandos nosotros. Para ejecutar un script tenemos 2 alternati as. !a primera es llamar al intrprete pasndole el fichero de texto que contiene el script como primer parmetro "sh script.sh#$ esto slo requiere que el archi o tenga permiso de lectura. !a segunda es indicando en el archi o la ruta del intrprete de comandos en la primera lnea de la siguiente forma% &'()in()ash "en este caso ()in()ash es la ruta al intrprete )ash$ que ser el que utilicemos$ pero aqu se puede poner la ruta a nuestro intrprete fa orito#. En este *ltimo caso )asta con darle permiso de ejecucin y llamar directamente al script ".(script.sh#. Un script simple puede tener una serie de comandos seguidos y ya est% #!/bin/bash mkdir dir1 cd dir1 touch arch1 cd .. ln -s dir1/arch1 enl1
2 Comentarios
Un comentario en un script es una lnea que ser ignorada por el intrprete de comandos. En estas lneas podemos poner cualquier nota o apunte que nos resulte *til$ por ejemplo$ para recordar en el futuro que es lo que reali+a)a una parte del script que hicimos hace tiempo. Un comentario siempre empie+a por &$ lo que haya detrs ser completamente ignorado hasta que pasemos a la siguiente lnea% #!/bin/bash #Este es un comentario cualquiera #Creamos el directorio dir1 y dentro creamos el archivo arch1 mkdir dir1 cd dir1 touch arch1 cd .. #Creamos un enlace a dir1/arch1 ln -s dir1/arch1 enl1
3 Variables
Una aria)le se puede decir que es un nom)re que se le da a un dato cualquiera para luego poder acceder a l sin pro)lemas. Por ejemplo$ si queremos preguntarle a alguien por su nom)re en
un script$ ha)r que almacenar ese nom)re en una aria)le$ ya que no podemos sa)er el nom)re que introducir. ,e esa forma podremos acceder a su nom)re sin conocerlo$ simplemente conociendo el nom)re de la aria)le es suficiente% #!/bin/bash echo Escribe tu nombre #Almacenamos el nombre que escriba el usuario en una variable llamada nombre read nombre #Ahora no sabemos su nombre !ero cuando lo escriba lo tendremos "uardado en nombre #correcto echo #ola $nombre #incorrecto echo #ola nombre #%ambi&n !odemos dar el valor a una variable de esta 'orma var(#ola echo $var $nombre Para acceder al alor de una aria)le hay que ponerle el sm)olo - delante y para darle un nue o alor no hace falta. .i queremos acceder a una aria)le$ pero tiene texto pegado$ podemos encerrar el nom)re entre lla es /01/ detrs del sm)olo -. #!/bin/bash var(arch #)ueremos crear un archivo llamado archnombre touch $*var+nombre #As, no busca una variable que se llame -varnombre- sino -var.i queremos que un carcter especial como - se interprete como una carcter normal y no como un identificador de aria)les$ hay que 2escaparlo3$ es decir$ poner el sm)olo /4/ delante% #!/bin/bash var(./ echo Esto me ha costado $var 0$. #Esto mostrar,a la 'rase1 Esto me ha costado ./ $.
4 echo y read
5a hemos isto que la orden echo es para mostrar mensajes por pantalla. !a orden read se puede usar para darle alor a una aria)le como ya se ha mostrado en los ejemplos. 6am)in se puede dar alores a ms de una aria)le de una e+% $ read var hola que tal var contendr el texto 2hola que tal3 $ read var1 var. var2 hola que tal bien
var1 contendr 2hola3$ var. contendr 2que3 y var2 contendr 2tal )ien3 7 cada aria)le se le asigna una pala)ra$ y a a la *ltima$ el resto del texto.
5 Parmetros
!os parmetros son opciones o alores que se le pasan al programa cuando se ejecuta por lnea de comandos$ la estructura es la siguiente% nom)re8progama param9 param2 param: param; ... Por ejemplo$ al crear un directorio con m<dir podemos er las equi alencias de la siguiente manera% mkdir -! dir1/dir1-1 dir. param: dir2 param;
Para acceder a los alores de los parmetros dentro del programa$ se accede con las aria)les especiales -9$ -2$ -:$ -;$ ... Estarn numeradas seg*n el orden del parmetro. Para acceder a los parmetros a partir del =$ de)ern encerrarse los n*meros entre lla es /01/ "-09>1$ -0991$ ...#. #!/bin/bash echo 3e llamo $1 y ten"o $. a4os ./scri!t.sh 5uanito ./ ?e llamo @uanito y tengo 2> aAos 6am)in tenemos las aria)les especiales% -> % Bom)re del programa -& % B*mero de parmetros en iados -C % !ista con todos los parmetros en iados
Comillas
7d ertencia% 7l copiar y pegar tro+os de cdigo de este documento que contengan comillas$ puede que estas no se copien de forma correcta "caso de las comillas do)les casi siempre# y el programa no funcione )ien. Por ello se recomienda$ una e+ pegado el tro+o de cdigo$ ol er a reescri)ir todas las comillas que apare+can. En la programacin en el shell Dash existen : tipos de comillas% /Eomillas simples/ % !as comillas simples encierran una cadena de texto que se representa despus tal como se ha escrito$ es decir$ no se sustituyen ni aria)les ni caracteres especiales que estn dentro de este tipo de comillas. 2Eomillas do)les 2 "7 la derecha de la tecla ># % !as comillas do)les tienen una funcin similar a las comillas simples. !a diferencia es que primero sustituyen las aria)les y los caracteres especiales por su alor y a continuacin el resultado de esa sustitucin es como si estu iera encerrado en comillas simples.
FEomillas in ertidasF " 7 la derecha de la tecla p# % !as comillas in ertidas se utili+an para encerrar un comando y despus son sustituidas por la salida que produce la ejecucin de ese comando. #!/bin/bash var(3ensa6e echo -os mando un $var#Esto escribir71 os mando un $var echo os mando un $var #Esto escribir71 os mando un 3ensa6e echo 8ls -l8 #3ostrar7 la salida de e6ecutar ls -l #%ambi&n se !ueden !oner cadenas de te9to se"uidas encerradas en di'erentes ti!os #de comillas echo -:a variable $var tiene el valor1- $var 8date8 #Esto mostra;a1 :a variable $var tiene el valor1 3ensa6e lun 'eb .< 1.1.212< CE% .//= Euando pongamos una cadena de texto sin encerrarla en comillas de ning*n tipo se comportar principalmente como si la hu)iramos encerrado entre comillas do)les$ pero cualquier cantidad de espacios seguidos$ ta)uladores o saltos de lnea los interpretar como un slo espacio. #!/bin/bash echo Aqu, van > es!acios #3ostrar71 Aqu, van > es!acios echo Aqu, van > es!acios # 3ostrar71 Aqu, van > es!acios
! Condiciones
Eomo eremos ms adelante$ lo que hemos aprendido hasta ahora$ nos deja muy limitados. GEmo podramos hacer un script que preguntase un n*mero y dependiendo del n*mero introducido hiciese una cosa u otraH$ GEmo se podra hacer una operacin 9>> eces seguidas sin tener que escri)ir nosotros el comando 9>> eces dentro del scriptH. Este tipo de cosas tan simples no se pueden hacer simplemente con lo que hemos aprendido hasta ahora. 7ntes de aprender a hacer cosas como las mencionadas anteriormente$ amos a aprender que es una condicin$ y como representarlas en el intrprete de comandos )ash. Una condicin es algo que cuando se comprue)a slo puede dar 2 alores como resultado$ el alor erdadero "se representa como > en )ash script# que indica que la condicin es lida$ y el alor falso "se representa como 9# que indica lo contrario. Una condicin puede ser por ejemplo 2x es mayor que y3$ siendo x e y n*meros.
Euando queremos unir 2 o ms condiciones para e aluar si son ciertas o no$ es decir$ podemos crear un programa que te pregunte la altura y el peso$ y en funcin de eso mostrar mensajes diferentes. En este caso podemos e aluar 2 condiciones "altura y peso# de la siguiente forma% ?i altura es i"ual que 9 y !eso mayor que y ?i altura es i"ual que 9 y !eso menor que @ ?i altura es mayor que ' o !eso menor que " etc&tera. En este caso tendremos 2 operadores especiales$ llamados operadores lgicos$ estos son el operador 2y3 y el operador 2o3. Operador y: El operador 2y3 se e al*a como erdadero si todas las condiciones unidas con este operador son erdaderas$ y falso en el caso contrario. Imaginemos la e aluacin de% 2condiciAn1 y condiciAn. y condiciAn23 condicin9 condicion2 condicion: resultado Jerdadero Jerdadero Kalso Kalso Jerdadero Kalso Jerdadero Kalso Jerdadero Jerdadero Kalso Kalso Jerdadero Kalso Kalso Kalso
En definiti a si cualquier alor e aluado con 2y3 es falso$ el resultado ser falso. Operador o: El operador 2o3 se e al*a como falso si todas las condiciones unidas con este operador son falsas$ y erdadero en el caso contrario. Es decir$ es suficiente con que se cumpla una de las condiciones. Imaginemos la e aluacin de% 2condiciAn1 o condiciAn. o condiciAn23 condicin9 condicion2 condicion: resultado Jerdadero Jerdadero Kalso Kalso Jerdadero Kalso Jerdadero Kalso Jerdadero Jerdadero Kalso Kalso Jerdadero Jerdadero Jerdadero Kalso
En definiti a si cualquier alor e aluado con 2o3 es erdadero$ el resultado ser erdadero. 6am)in existe otro operador lgico que es la negacin$ en este caso lo amos a representar como 2'3$ cualquier condicin que tenga delante esta negacin da como resultado el alor contrario al de la condicin$ es decir$ se niega el resultado de la condicin dando como resultado lo contrario.
!as condiciones se pueden agrupar entre parntesis igual que si de expresiones matemticas se tratara$ simplemente hay que e aluar primero las condiciones de los parntesis y sustituir el parntesis por el resultado% condiciAn1 y condiciAn. y BcondiciAn2 o condiciAnCD condiciAn1(verdadero condiciAn.(verdadero condiciAn2('also condiciAnC(verdadero verdadero y verdadero y B'also o verdaderoD -E 'also o verdadero ( verdadero verdadero y verdadero y verdadero verdadero Ltro ejemplo% '"verdadero y B'also o 'also o Bverdadero y 'alsoDDD !Bverdadero y B'also o 'also o 'alsoDD !Bverdadero y 'alsoD !B'alsoD verdadero
cd dir FF cd dir2 FF touch arch1 GG echo Ho he !odido crear arch1 dentro de dir2 V FF cd dir2 FF touch arch1 GG echo Ho he !odido crear arch1 dentro de dir2 V FF F FF touch arch1 GG echo Ho he !odido crear arch1 dentro de dir2 F FF / GG echo Ho he !odido crear arch1 dentro de dir2 F GG echo Ho he !odido crear arch1 dentro de dir2 F GG V V !os comandos con ( de)ajo son los que no se han ejecutado. En este caso /touch arch9/ slo se ejectura si /cd dir:/ se hu)iera ejecutado sin pro)lemas. .i ponemos un sm)olo de admiracin /'/ antes de un comando "separado por un espacio#$ estaremos haciendo una negacin$ es decir$ si el resultado del comando es J$ pasar a ser K y ice ersa. ! cd dir GG echo enhorabuena estamos dentro de dir cd dir FF echo enhorabuena estamos dentro de dir
%&2 (#aluaci)n de e*presiones& +a orden ,test,& En shell script$ tenemos una orden o comando llamado test$ que e al*a una serie de condiciones y de uel e el alor final$ es decir$ erdadero$ o falso. Qay dos formas de llamar a este comando. test condiciAn I condiciAn J Euando e aluamos una expresin con los corchetes /RS/$ hay que tener muy en cuenta que se de)e dejar un espacio entre el primer corchete y la condicin y tam)in al poner el *ltimo corchete. Operadores para ficheros: 6ra)ajan con ficheros y algunos de los que existen son% -e 'ichero % Eomprue)a si el fichero existe -' 'ichero % Eomprue)a si el fichero existe y adems es un fichero normal y corriente -d 'ichero % Eomprue)a si el fichero existe y adems es un directorio -r 'ichero % Eomprue)a si el proceso "script# tiene permiso de lectura so)re el fichero -K 'ichero % Eomprue)a si el proceso "script# tiene permiso de escritura so)re el fichero -9 'ichero % Eomprue)a si el proceso "script# tiene permiso de ejecucin so)re el fichero -s 'ichero % Eomprue)a si el fichero no es aco "tiene ms de > )ytes# 'ich1 -nt 'ich. % Eomprue)a si fich9 se ha modificado ms recientemente que fich2 'ich1 -ot 'ich. % Eomprue)a si fich9 se ha modificado antes "es ms iejo# que fich2 Operadores para cadenas de texto: 6ra)ajan con texto y algunos de los que existen son%
te9to1 ( te9to. % Eomprue)a si las dos cadenas de texto son idnticas "no pueden ser cadenas de texto acas# te9to1 !( te9to. % Eomprue)a si las dos cadenas de texto son diferentes "no acas# -@ te9to % Eomprue)a si la cadena de texto est aca "longitud ># -n te9to % Eomprue)a que la cadena de texto no est aca "longitud N ># Operadores para manejar nmeros: 6ra)ajan comparando alores numricos% num1 -eq num. % Eomprue)a si los n*meros son iguales num1 -ne num. % Eomprue)a si los n*meros son distintos num1 -"t num. % Eomprue)a si num9 es mayor que num2 num1 -"e num2 % Eomprue)a si num9 es mayor o igual que num2 num1 -lt num. % Eomprue)a si num9 es menor que num2 num1 -le num. % Eomprue)a si num9 es menor o igual que num2 Operadores 'y', 'o', 'no' y parntesis: .e pueden unir condiciones o negarlas y agruparlas de la siguiente manera% El operador /y/ se representa con /Ma/. num1 -eq num. -a num1 -"t num2 % Eomprue)a si num9 es igual a num2 y adems mayor que num:. El operador /o/ se representa con /Mo/. -r arch1 -o -9 arch1 % Eomprue)a si arch9 tiene permisos de lectura o de ejecucin. El operador /no/ se representa con /'/. ! -s arch1 % Eomprue)a que el fichero arch9 si es aco Para utili+ar los parntesis hay que escaparlos$ es decir$ poner el sm)olo /4/ antes de cada parntesis$ ya que estos son sm)olos especiales para el intrprete y queremos e itar que los interprete como tales. $var -ne / -a 0B -' arch1 -o -d arch1 0D % Eomprue)a si el alor de la aria)le - ar es distinto de > y adems$ comprue)a si arch9 es un fichero normal o un directorio.
Qay una manera de que ejecute una serie de instrucciones cuando no se cumpla la condicin. ,e esta forma podemos ejecutar instrucciones cuando se cumple la condicin$ y cuando no se cumple ejecutar otras. i' I condiciAn J then # instrucciones a e6ecutar si se cum!le la condiciAn else # instrucciones a e6ecutar si no se cum!le la condiciAn 'i !a condicin else "lo que se ejecutar en el caso de que la condicin no se cumpla no es o)ligatoria si no se necesita#. ,espus de la pala)ra /else/ no se de)e poner /then/. Por *ltimo$ si queremos que cuando una condicin se cumpla ejecutar unas instrucciones$ cuando se cumpla otra$ ejecutar otras$ y as podemos hacer lo siguiente% i' I condiciAn1 J then # instrucciones a e6ecutar si se cum!le la condiciAn1 eli' I condiciAn. J then # instrucciones a e6ecutar si se cum!le la condiciAn. else # instrucciones a e6ecutar si no se cum!le nin"una condiciAn 'i Puede ha)er tantas instrucciones /elif/ como creamos necesario$ pero slo una instruccin /else/ como mximo "puede no ha)er ninguna#$ ya que es lo que se ejecutar cuando no se haya cumplido ninguna de las anteriores condiciones.
,espus de cada condicin elif tam)in se pone la pala)ra then en la siguiente lnea. Existe una instruccin nula que se representa con dos puntos /%/. !a podemos usar cuando no queremos que se ejecute nada en un punto de la estructura if por ejemplo. i' I condiciAn J then # ?i no queremos e6ecutar nada si es verdadera !odemos !oner la instrucciAn nula 1 else #instrucciones a e6ecutar si no se cum!le la condiciAn B'alsaD 'i Ejemplos:
.cript que comprue)a si reci)e como mnimo 2 parmetros. .i reci)e menos$ muestra un
mensaje de error y sale. #!/bin/bash i' I $# -lt . J then echo El !ro"rama necesita . !ar7metros al menos e9it 1 'i
.cript igual que el anterior$ pero adems comprue)a que el primer parmetro sea igual a 2s3$ o a 2n3$ porque sino tam)in dar error.
#!/bin/bash i' I $# -lt . J then echo El !ro"rama necesita . !ar7metros al menos e9it 1 else i' I $1 !( s -a $1 !( n J then echo El !rimer !ar7metro debe ser 0s 0o 0n0. e9it 1 'i 'i
.cript que pregunte por el nom)re de 2 ficheros. ,espus comprue)a si existe el primer fichero$ y si existe$ escri)e el contenido del directorio dentro. .i no existe el primero$ comprue)a si existe el segundo como alternati a para hacer lo mismo. En caso de que no exista ninguno de los 2 mostrar un mensaje de error y terminar el programa.
#!/bin/bash echo %eclea nombre !ara el !rimer 'ichero a escribir1 read 'ich1 echo %eclea nombre de un 'ichero alternativo !or si no e9iste el !rimero1 read 'ich. i' I -e $'ich1 J then ls -l EE $'ich1 echo #e escrito la in'ormaciAn en $'ich1 eli' I-e $'ich. J then ls -l EE $'ich. echo #e escrito la in'ormaciAn en $'ich. else
12 1edireccionamiento
7 estas alturas ya hemos isto que podemos construir expresiones del tipo% echo una frase > archivo ls -l >> archivo Este tipo de expresiones$ lo que hacen es redirigir la salida del programa$ es decir$ el texto que normalmente mostrara por pantalla$ a un archi o que nosotros le especifiquemos. 5a hemos isto que hay 2 formas de redirigir la salida de un comando o programa. !a primera es mediante /!/$ que sustituye todo lo que hu)iera anteriormente en el archi o por el texto de salida del programa "tam)in crea el archi o si no exista antes#. !a segunda es mediante / !!/$ que hace exactamente lo mismo$ slo que no )orra los contenidos anteriores del archi o de texto$ sino que aAade el nue o texto al final del mismo.
Dueno$ pues ahora hemos de distinguir 2 tipos de salidas que puede tener un programa$ la salida estndar y la salida de error. !a salida estndar son los mensajes que el programa en a cuando todo funciona de la forma esperada$ es decir$ correctamente. !a salida de error son los mensajes que el programa en a cuando algo ha fallado. Un script puede generar am)as salidas si algunos comandos funcionan correctamente mientras que otros fallan "si no las redireccionamos$ am)as aparecern siempre por pantalla$ juntas#. !, !! Tedireccionan la salida estandar a alg*n archi o que indiquemos
"!, "!! Tedireccionan la salida de error a alg*n archi o que indiquemos #!, #!! Tedireccionan las " salidas a alg*n archi o que indiquemos Ejemplo% & El directorio dir ya existe mkdir dir & Producir la salida% mkdir1 no se !uede crear el directorio LdirM1 El 'ichero ya e9iste & Esta salida es de error porque el comando ha fallado. mkdir dir E salida.t9t & Eomo estamos redireccionando slo la salida estandar y el mensaje era de error$ nos & seguir apareciendo lo mismo de antes. mkdir dir .E salida.t9t mkdir dir FE salida.t9t & En estos casos si que se guardar el mensaje de error porque redireccionamos & la salida correcta Eon esto tam)in podemos lle ar la salida normal de un programa a un archi o y la salida de error a otro archi o diferente y as anali+ar los mensajes por separado por ejemplo% sh script.sh > salida.txt 2> error.txt !a salida estndar se numera como 9 "esto quiere decir que aunque podemos utili+ar el sm)olo /!/ para redireccionar la salida estndar$ lo ms correcto sera usar /$!/#$ y la de error como salida 2. ,entro de un script$ podemos hacer por ejemplo$ que la salida de un comando echo$ salga por la salida de error$ esto se hace de la siguiente forma. &'()in()ash echo 2elige un n*mero del 9 al :3 read opcion if R -opcion U 293 S then echo 2Qas elegido el n*mero 93 elif R -opcion U 223 S then echo 2Qas elegido el n*mero 23 elif R -opcion U 2:3 S
then echo 2Qas elegido el n*mero :3 else echo numero incorrecto $!#" fi ,e esta forma$ el mensaje 2numero incorrecto3 saldr por la salida de error$ que adems es lo que queremos$ ya que es un mensaje de error. !a expresin / $!#"/ se podra interpretar como redireccionar el mensaje que normalmente aparecera por la salida estndar "9#$ a la salida de error "2#. 7 lo mejor nos interesa que alguna de las salidas "o am)as# no apare+ca ni por pantalla$ ni se guarde en ning*n archi o. Esto se puede conseguir redireccionando la salida de un programa al fichero especial /%de&%null/. Este fichero$ es como un agujero negro$ que se tragar todos los mensajes que le en iemos y desaparecern. ,e esta forma% mkdir dir 2> /dev/null Estamos redirigiendo la salida de error a (de (null$ lo que quiere decir que el comando no mostrar mensajes de error. En este caso$ esto significa$ que si ya existe el directorio /dir/ no se mostrar un mensaje de error. Ltra forma de sa)er$ por ejemplo$ si existe un fichero$ adems de R Me fichero S$ es ejecutar el comando ls so)re ese fichero. .i existe el fichero el comando funcionar )ien$ y si no existe dar un error. Eomo hemos isto$ eso es equi alente a de ol er erdadero o falso. if R Me ficheroS then echo 2fichero ya existe3 else echo 2fichero no existe3 fi if ls fichero ON (de (null then echo 2fichero ya existe3 else echo 2fichero no existe3 fi
Eomo se o)ser a$ al ejecutar el comando /ls fichero/$ no nos interesa ni mensaje con el listado con el fichero$ ni el mensaje de error que pueda dar$ solamente si funciona o no. Por eso redirigimos am)as salidas a (de (null $ para que no nos muestre ning*n mensaje por pantalla
13 (*presiones matemticas
Existen 2 comandos que e al*an expresiones matemticas y lgicas. El primero de ellos es el comando expr que e al*a una expresin matemtica$ lgica$ e incluso con cadenas de texto$ y de uel e el resultado de la e aluacin por la salida estndar. expr 3 + = Este comando acepta los operadores matemticos V$ M$ C$ ( y W "resto de una di isin#. 6am)in acepta los operadores lgicos N$ X $ NU$ XU$ U y 'U "distinto de#. 6am)in acepta operadores de cadenas de texto como /len'th cadena de texto/ que te muestra la longitud que tiene una cadena de texto$ o /su)str 2cadena de texto3 inicio longitud/$ que saca un tro+o del texto con una longitud
indicada empe+ando desde la posicin indicada tam)in. expr len'th esto es un texto 9Y & ,esde el carcter n*mero Y MN /q/$ de uel e : caracteres. expr su(str hola )ue tal * + que & ,esde el carcter n*mero ; MN /a/$ de uel e Z caracteres. expr su(str hola )ue tal , a que t !os caracteres especiales$ como por ejemplo C$ N$ X$ "$ #$ han de /escaparse/$ es decir ponerles la )arra in ertida /4/ delante para que se interpreten como caracteres normales. 6odos los operadores y operandos de)en de estar separados por un espacio entre si. .e pueden agrupar expresiones entre parntesis !os operadores lgicos de uel en 9 si es erdadero y > si es falso.
?s ejemplos% expr " ./ + Y expr + .0 " > expr .1 " 2 " .3 .! + 9 El otro comando que e al*a expresiones matemticas y lgicas es let. Est limitado a este tipo de expresiones$ pero es )astante ms flexi)le que el anterior. Eon este comando asignamos la e aluacin de una expresin a una aria)le "es aconseja)le casi siempre encerrar la expresin entre comillas ya que nos ahorrar pro)lemas con caracteres especiales. El comando expr no soporta las comillas$ pero let si#. Ejemplos% let &ar 4 , 2 + echo 5&ar Z let &ar 4 , ! 1 * 6 , 3 echo 5&ar > let &ar 4 , let &ar 4 5&ar / + echo 5&ar 92 Bo hace falta con este comando$ separar los operadores y los operandos por espacios$ adems$
al estar encerrada la expresin entre comillas no hace falta /escapar/ los caracteres especiales. 7hora un par de equi alencias *tiles% let &ar 4 5&ar 2 $ 7 let &ar22 let &ar 4 5&ar 8 $ 7 let &ar88 Por *ltimo$ amos a er la diferencia entre asignar un alor a una aria)le utili+ando el comando expr y el comando let. & Korma clsica con expr$ asgnar a una aria)le la salida de un comando arUFexpr : V ;F & Eon let es ms intuiti o let 2 ar U : V ;3 9mportante% cuando se utili+a let$ a diferencia de expr$ utili+ar /U/ no significa comparar si dos n*meros son iguales$ sino asignar un alor a una aria)le. Para comparar si dos n*meros son iguales se utili+a el do)le igual /UU/ "dos sm)olos de igual pegados#.
dir/ 7 pala)ra dir$ seguida de cualquier cosa "dir$ direct$ dir9$ directorio$ ...# dir: 7 pala)ra dir$ seguida de 9 carcter cualquiera "dir9$ dira$ dir+$ dirZ$ ...# dir;$"+,< 7 pala)ra dir$ seguida de uno de los caracteres entre corchetes "dir9$ dir2$ dir: o dir;#. Por ejemplo /dir=/ no sera lida. dir;a8j< 7 pala)ra dir seguida de una letra entre la /a/ y la /j/. El guin significa un rango entre el primer carater y el segundo "dira$ dirf$ dird#. Por ejemplo /dirt/ no sera lido. .e pueden unir en una pala)ra tantos metacaracteres como queramos% ls a/t:;$8=< 7 !ista archi os que se llamen por ejemplo% ate9$ aperiti2$ algo[$ alt=9. Eon el sm)olo '!' L '>' negamos el carcter o el rango que tengamos detrs. ls ;!a</ 7 7rchi os que no empiecen por la letra a ls ;!?8=</ 7 7rchi os que no empiecen por un n*mero m& :m;a8@<Atxt 7 7rchi os cuyo primer carcter sea cualquiera$ la segunda letra sea una m$ la tercera$ una letra entre /a/ y /+/$ y despus la extensin /.txt/.
Existen caracteres especiales representar para cadenas de texto$ que no sim)oli+an letras ni n*meros$ sino que sim)oli+an espacios$ ta)ulaciones$ saltos de lnea$ etc... Estos caracteres se pueden consultar por ejemplo en el manual del comando echo "man echo#. 7lgunos son% .n 7 .alto de lnea .t 7 6a)ulacin Para acti ar estos caracteres utili+ando echo$ hay que utili+ar la opcin Me. Ejemplos% echo 8e Esto es una lBneaA.nEsta es otra Esto es una lnea Esto es otra echo 8n 8e $3Opcin $ .n"3Opcin ".n.tEli'e una opcin: 9#Lpcin 9 2#Lpcin 2 Elige una opcin%
15 (structura case
Esta estructura es muy fcil de entender una e+ entendido como funciona la estructura if. 5a que el funcionamiento es similar$ pero ms limitado. !a estructura es la siguiente% & .e pueden poner tantas opciones como se quieran case &alor in &alor$3 &ordenes a ejecutar si el alor coincide con alor9CC &alor"3 &ordenes a ejecutar si el alor coincide con alor2CC &alor+3 &ordenes a ejecutar si el alor coincide con alor:CC esac 9mportante: !as instrucciones a ejecutar se pueden poner inmediatamente a continuacin del alor o en la lnea siguiente$ eso no importa$ lo que s hay que tener en cuenta es que despus de la *ltima instruccin dentro de un alor de)e ha)er siempre dos punto y coma 'CC' seguidos$ justo despus de la instruccin o en la lnea de a)ajo$ como se prefiera. En este caso lo que e aluaremos siempre es el alor que tiene una aria)le$ y dependiendo del alor$ se ejecutaran unas acciones u otras$ algo similar a cuando reali+)amos un men* con la estructura if$ pero ms claro. 7qu podemos er la equi alencia. echo 29# opcion93 echo 29# opcion93
echo 22# opcion23 echo Me Mn 24tElige una opcin% 3 read opcion case -opcion in $3 echo 2Lpcin 9 elegida3CC "3 echo 2Lpcin 2 elegida3CC /3 echo 2Lpcin no lida3 9NO2CC esac
echo 22# opcion23 echo Me Mn 24tElige una opcin% 3 read opcion if R -opcion U 293 S then echo 2Lpcin 9 elegida3 elif R -opcion U 223S echo 2Lpcin 2 elegida3 else echo 2Lpcin no lida3 9NO2 fi
En este caso$ las estructuras son idnticas$ aunque la opcin case es la ms limpia. Esta se e al*a de la misma forma que los if y elif$ es decir a compro)ando de arri)a a a)ajo las condiciones$ y cuando encuentra una lida$ ejecuta las ordenes que hay a continuacin. Eomo ya hemos isto los metacaracteres C$ H$ y RS$ podemos intuir que si ponemos / como alor significar cualquier cosa$ y entrar ah siempre que no haya entrado antes en ninguno de los otros alores "como en el caso de if$ slo entrar en uno de los alores cuando se ejecuta$ nunca en ms#. Por este moti o$ se puede decir que el alor C$ se comporta exactamente igual que else$ es decir$ si no ha encontrado antes una condicin lida$ entrar ah siempre. 7qu podemos er un ejemplo$ simple utili+ando metacaracteres. En este caso amos a preguntar al usuario por la confirmacin de algo$ y amos a compro)ar si el usuario ha contestado afirmati a o negati amente. 7 nosotros nos da igual si el usuario contesta 2s3$ 2si3$ 2.3$ 2.i3$ 2si quiero3$ 2n3$ 2BL3$ etc... !o que nos interesa para e aluar la opcin es sa)er si la primera letra es una /s/ o una /n/ "may*scula o min*scula#$ y el resto del texto nos da igual. !o podemos hacer as% echo 2G,esea continuarH%3 read resp case -resp in ;sD</3 &.i la respuesta es una s o una . seguido de /lo que sea/ echo 2Qa elegido continuar3CC ;nE</3 &.i la respuesta es una n o una B seguido de /lo que sea/ echo 2Qa elegido no continuar3 exitCC /3 echo 2Tespuesta no lida3 9NO2CC esac
/ucles
Qasta ahora$ las condiciones que hemos isto nos permiten ejecutar una serie de acciones diferentes seg*n se cumpla una condicin determinada$ como por ejemplo que el alor de una aria)le sea 9$ 2$ :$ o ;$ etc... !o que no sa)emos hacer toda a es ol er hacia atrs en un script. .iempre hemos ido hacia
delante hasta que llega)amos al final del script$ y este finali+a)a. Pero podemos encontrarnos con la situacin de que si el usuario no introduce una opcin lida$ podamos seguir preguntndole hasta que introdu+ca una opcin que s sea correcta$ y de esa manera no tener que ol er a ejecutar todo el script otra e+. .e puede decir que un )ucle$ es un conjunto de instrucciones que se repiten$ es decir$ cuando llega al final de esas instrucciones$ uel e a empe+ar desde el principio del conjunto. Bormalmente$ no queremos que esas instrucciones se repitan todo el tiempo$ y nunca terminen$ ya que en ese caso estaramos ha)lando de un (ucle infinito "siempre se repite y nunca terminar#. Por ello$ esta)leceremos una condicin o conjunto de condiciones que se de)ern cumplir si queremos que las instrucciones dentro del )ucle se uel an a repetir$ o no. Ejemplo de un )ucle infinito. Podemos o)ser ar como despus de ejecutar todas las instrucciones uel e a empe+ar desde el principio%
1 &1 (structura 3hile 4mientras5 Esta estructura esta)lece un )ucle dentro de si misma. Este )ucle de instrucciones se repetir siempre que la condicin que pongamos sea cierta. .e puede decir que es como una estructura if$ con la diferencia de que cuando termina$ uel e al principio a compro)ar otra e+ la condicin una y otra e+ hasta que esta no se cumpla. !a estructura Fhile es as% Fhile R condicin S do & Instrucciones dentro del )ucle done Eomo podemos o)ser ar$ siempre que la condicin sea cierta$ se ejecutarn las instrucciones dentro del )ucle una y otra e+$ hasta que la condicin sea falsa.
Esta condicin nos puede ser ir para cuando detectamos un error$ o que el usuario introduce una condicin que no es lida y le queremos seguir insistiendo hasta que nos de una opcin correcta. Ejemplo% &'()in()ash echo Mn \G,esea continuar "s(n#H% \ read resp # 3ientras que la res!uesta sea di'erente de s y de n si"ue !re"untando Fhile R -resp 'U \s\ Ma -resp 'U \n\ S do echo \Tespuesta no alida. G,esea continuar "s(n#H\ read resp done if R -resp U 2n3 S then exit fi Ltro uso que le podemos dar a esta estructura es el de repetir algo un n*mero determinado de eces% repeticionesU: iU> # 3ientras el contador sea menor que el total re!ite Fhile R -i Mlt -repeticiones S do # Como la variable va de / a . le sumamos 1 al mostrarla # !ara que a!are@can nNmeros del 1 al 2 echo \Tepeticin numero% \ Fexpr -i V 9F #incrementamos en una unidad la variable i let iVV done Ltro ejemplo% echo \GEuantos directorios deseas crearH\ read total numU9 # ?i el nNmero es mayor que el total !aramos de crear mientras tanto s, creamos. Fhile R -num Mle -total S do # Oor si acaso e9iste el directorio quitamos los mensa6es de error
m<dir dir-0num1 2N (de (null # incrementamos la variable num una unidad m7s !ara el si"uiente directorio let numVV done echo \Qemos creado -total directorios.\ 1 &2 (structura 6or !a estructura for funciona de manera similar a la estructura Fhile$ aunque est pensada para ser usada en casos ms concretos "algo similar a lo que pasa con la estructura case con respecto a if#. !a estructura if se puede usar de dos maneras. !a primera es la siguiente% for aria)le in lista do & Instrucciones dentro del )ucle done Este )ucle se repetir siempre tantas eces como elementos haya en la lista. En cada repeticin la aria)le utili+a para iniciar el )ucle tomar como alor el siguiente elemento de la lista$ as en la primera repeticin tomar el alor del primer elemento de la lista y as sucesi amente. Esta lista puede ser una lista de pala)ras o n*meros. .i queremos agrupar texto para que por ejemplo$ si ponemos un nom)re y apellido ayan juntos y no sean elementos diferentes de)emos agruparlos entre comillas% for nom(re in Grancisco HartBne@ Iuan Jpe@ & .e repetir ; eces "; elementos# for nom(re in Grancisco HartBne@ Iuan Jpe@ & 7s es correcto$ se repetir 2 eces. &'()in()ash & Este )ucle se repetir = eces for num in 9 2 : ; ] Y Z [ = do echo \Tepeticin n*mero -num\ done & Ereamos los siguientes directorios for dir in dir9 dir2 dir: dir; dir] do if R ' Me -dir S then m<dir -dir fi done & ?ostramos los parmetros reci)idos echo \B*mero de parmetros -&\ numU9
for param in -C do echo \Parmetro -num% -param\ let numVV done Existe$ sin em)argo$ otra forma de utili+ar el )ucle for. Esta otra forma es muy *til so)retodo cuando queremos hacer un contador$ y queda ms limpio que utili+ando la estructura Fhile% for "" instr9^ condicin^ instr2 ## do & Instrucciones que se repiten hasta que condicin sea falsa done En esta estructura tenemos un )ucle for$ y encerrados entre un do)le parntesis una instruccin que se ejecutar justo antes de comen+ar el )ucle por primera e+ " instr$#$ una condicin que indicar si se ejecutan las instrucciones dentro del )ucle o se terminar y una instruccin final que se ejecutar como *ltima instruccin dentro del )ucle " instr"#. .e podra expresar as en pseudocdigo% instr9 mientras condicinU erdadera instrucciones dentro del )ucle instr2 fmientras 9mportante: las instrucciones y condiciones dentro del do)le parntesis se escri)en de forma casi idntica a las instrucciones cuando se utili+a el comando let. ,e esta manera$ una condicin de si un n*mero es mayor que otro se escri)ir n$ ! n"$ si se quiere comparar si dos n*meros son iguales se escri)ir n$ 44 n"$ etc... "de forma idntica a cuando se utili+a let# Eomparati a contador con for y Fhile &'()in()ash & Este )ucle se repetir = eces for "" i U 9^ i XU =^ iVV ## do echo \Tepeticin n*mero -i\ done &'()in()ash & Este )ucle se repetir = eces let \i U 9\ _hile R -i Mle = S do echo \Tepeticin n*mero -i\ let iVV done
En el ejemplo con for$ reali+a los pasos de forma idntica a como los reali+a en el ejemplo con Fhile$ pero sin em)argo nos estamos ahorrando 2 lneas en el cdigo del programa. 1 &3 1uptura de bucles7 ,brea8, y ,continue,
Qasta ahora hemos isto que para salir de un )ucle la condicin de entrada en dicho )ucle de)e ser falsa$ y adems$ sa)emos que la instrucciones dentro del )ucle se ejecutarn hasta el final antes de ol er a repetirse. .in em)argo$ hay algunas ocasiones en las que podra interesarnos salir del )ucle de)ido por ejemplo a un error o a una situacin especial$ sin esperar a que la condicin de dicho )ucle se e al*e a falso. En otras ocasiones podra interesarnos saltarnos alguna de las iteraciones" ueltas# del )ucle y pasar a la siguiente. Para ello tenemos 2 instrucciones *tiles% (reaK% Esta instruccin al ejecutarse$ nos hace salir del )ucle donde nos encontramos. El resto de instrucciones dentro del )ucle no se llegan a ejecutar y adems ya no se comprue)a la condicin de continuidad de )ucle$ simplemente salimos de l. 7unque puede resultar )astante *til en ciertas ocasiones$ siempre que se pueda es mejor utili+ar la condicin del )ucle para salir de l. !a instruccin (reaK puede ser irnos so)retodo para salir de un )ucle al encontrar un error o algo inesperado y no pudisemos seguir ejecutando el )ucle con normalidad.
&'()in()ash encontradoU> & Jamos a )uscar el archi o /arch/ en una lista de directorios for dir in dir9 dir2 dir: dir; dir] do if R Me -0dir1(arch S then encontradoU9 & 5a no tiene sentido seguir )uscando (reaK fi done if R -encontrado Meq > S then echo \7rchi o no encontrado\ else echo \7rchi o encontrado en -dir\ fi continue% Esta instruccin$ a diferencia de (reaK$ no termina el )ucle$ sino que se salta las instrucciones que haya desde la pala)ra continue hasta el final del )ucle y pasa a la siguiente iteracin " uelta# del )ucle. Esto nos puede resultar muy *til cuando queremos hacer algo con una lista de cosas pero tenemos alg*n tipo de excepcin. &'()in()ash
echo Mn \Introduce n*mero mximo al que llegaremos% \ read nummax echo Mn \Introduce un n*mero para que los n*meros di isi)les entre l no apare+can% \ read di isor for "" i U 9^ i XU -nummax^ iVV ## do let \resto U -i W -di isor\ if R -resto Meq > S then & .i es di isi)le nos saltamos el resto y pasamos al siguiente continue fi echo \-i \ done Eomo se ha podido o)ser ar$ la instruccin continue$ en el caso de un )ucle del tipo 2 for "" instr9^ condicin^ instr2 ##3$ no afecta a instr"$ que se sigue ejecutando siempre al final del )ucle. 9mportante% aunque estas dos instrucciones nos pueden resultar muy *tiles en arias ocasiones$ no con iene a)usar de ellas "slo utili+arlas cuando de erdad se necesite#$ ya que podran hacer el cdigo del programa ms difcil de entender al alterar el comportamiento normal de un )ucle e introducir comportamientos no esperados.
&'()in()ash echo \Este es un mensaje muy largo$ y por eso oy a di idirlo 4 en dos partes. 5 as me ca)e sin pro)lemas$ o tal e+ de)iera 4 di idirlo en ms. !o que no hay que ol idar es que a continuacin 4 de la )arra in ertida es donde tiene que estar el salto de lnea.\ for dir in dir9 dir2 dir: dir; dir] dirY dirZ dir[ dir= 4 dir9> dir99 dir92 dir9: dir9; dir9] dir9Y do m<dir -dir done
Podemos aAadir un elemento adicional al ector$ o modificar uno existente$ de la misma forma que accedemos a l. &ector;"<4$P &ector;,<4+ 9EL9 E MNJOO ? $? $ P " $P + * , +
Podemos asignar un alor a un ndice$ por ejemplo el Z$ dejando ndices acos en medio$ aun)ue esta no es un prQctica muy aconseja(le en la mayorBa de las ocasiones. &ector;-<4"? 9EL9 E MNJOO ? $? $ P " $P + * , + P * "?
Qay un propiedad muy *til en la ectores$ y es el hecho de que si utili+amos '/' como ndice$ nos muestra el ector como si fuera una lista. &'()in()ash ectorU" uno dos tres cuatro cinco seis # & Jamos a mostrar los alores del ector por pantalla echo \-0 ectorRCS1\ `racias a esto podemos recorrer un ector de la siguiente forma% &'()in()ash ectorU" uno dos tres cuatro cinco seis # for alor in -0 ectorRCS1 do echo Mn \- alor \ done Ltra propiedad es como o)tener el n*mero de elementos que contiene un ector% &'()in()ash ectorU" uno dos tres cuatro cinco seis # & Jamos a mostrar el n*mero de elementos del ector por pantalla echo \Bumero de elementos% -0& ectorRCS1 \
5 por ello sera equi alente recorrer los alores del ector de la siguiente forma% &'()in()ash ectorU" uno dos tres cuatro cinco seis # & ,e esta manera de)emos sa)er que hay Y elementos en el ector for "" i U >^ i X Y^ iVV ## do echo \Elemento -0i1% -0 ectorR-iS1 \ done & 7qu no hace falta sa)er cuantos elementos tenemos for "" i U >^ i X -0& ectorRCS1^ iVV ## do echo \Elemento -0i1% -0 ectorR-iS1 \ done Eota% .e puede )orra el alor de una posicin del ector con el comando unset. 7simismo tam)in se puede )orrar el alor asignado a una aria)le "es como si ya no existiese#. &ector41 , P + * - 3 unset 5R&ector;,<S 7hora &ector tendr ; elementos en lugar de ]$ ya que hemos eliminado el *ltimo "ndice ;#. 6am)in podemos inicialmente dar los alores uno a uno$ en lugar de asignarle arios alores a la e+. En este caso$ el orden no importa$ pero no es aconseja)le dejar indices sin alor. ectorR>SU3uno3 ectorR2SU3tres3 ectorR9SU3dos3 ectorU" 2uno3 2dos3 2tres3 #
1% 6unciones
7unque no amos a profundi+ar demasiado en este tema$ amos a aprender lo que es una funcin y su utilidad de forma muy )sica. Una funcin se puede descri)ir como un tro+o del cdigo o conjunto de instrucciones que se agrupan para reali+ar alguna funcin especfica dentro del programa. Esta funcin especfica puede ser una operacin matemtica$ una )*squeda$ ordenacin$ etc... Una funcin se define con un nom)re seguido de /"#/ y /0/. 7 continuacin se escri)en las instrucciones que formarn parte de la funcin y se terminar cerrando la lla e /1/. Para llamar a esa funcin simplemente hay que poner el nom)re de la funcin en alg*n lugar del cdigo y cuando se ejecute$ nos trasladar al cdigo dentro de la funcin. Euando la funcin aca)e ol eremos al programa principal despus de la llamada a la funcin.
&'()in()ash # Aqu, sAlo estamos de'iniendo la 'unciAn # no se e6ecutar7 hasta que se la llame funcion "# 0 echo \.oy una funcin\ 1 echo \Jamos a llamar a la funcin...\ funcion Una funcin$ al igual que el programa principal cuando se ejecuta$ puede reci)ir parmetro$ y tra)aja con ellos de forma idntica. Es decir el primer parmetro se acceder con -9$ el segundo con -2$ el n*mero de parmetros con -&$ la lista con -C$ etc... Qay que tener en cuenta$ que de)ido a ello$ una funcin no tiene acceso directamente a los parmetros que reci)e el programa$ sino solamente a los parmetros con los cuales se llama a la funcin.
&'()in()ash & 7qu slo estamos definiendo la funcin$ & no se ejecutar hasta que se la llame funcion "# 0 echo \Qe reci)ido -& parmetros\ echo \Parametro 9% -9\ echo \Parametro 2% -2\ 1 funcion \par9\ \par2\ !a pala)ra return dentro de una funcin tiene una funcin similar a exit en el programa$ sale de la funcin de ol iendo un n*mero que puede ser un alor entre > y 2]]. El alor de retorno de la *ltima funcin llamada queda guardada en la aria)le 5:. &'()in()ash K7!.LU> JET,7,ETLU9 & Esta funcin comprue)a si un archi o existe. & .i existe de uel e 9MNJerdadero$ y si no >MNKalso existe 13 R if R Me -9 S then return -JET,7,ETL else
return -K7!.L fi S existe \archi o9.txt\ & Eompro)amos el alor de uelto por la funcin if R -H Meq -JET,7,ETL S then echo \El archi o existe.\ else echo \El archi o BL existe.\ fi Por *ltimo$ y )astante importante ya que no tiene nada que er con la gran mayora de los lenguajes de programacin y muestra una e+ ms las limitaciones que tiene )ash script con las funciones$ ha)lamos de las aria)les dentro de una funcin. !as aria)les que se crean dentro de una funcin son glo)ales$ es decir$ pueden ser accedidas posteriormente desde el programa principal y mantendrn el alor dado dentro de la funcin. .i queremos que una aria)le slo exista dentro de una funcin$ es decir sea local a la funcin$ simplemente hay que poner la pala)ra local delante cuando le demos alor. ,e esta forma$ la aria)le local dejar de existir cuando salgamos de la funcin "sera como ejecutar unset aria)le al salir de la funcin#. &'()in()ash suma "# 0 local num9U-9 local num2U-2 let \resultado U -num9 V -num2\ 1 suma ; Y # num1 y num. no e9isten 'uera de la 'unciAn al ser locales # as, que no los mostrar7 !or !antalla. Pesultado sin embar"o # no ha sido de'inida como local as, que estar7 accesible desde 'uera. echo \-num9 V -num2 U -resultado\ Es importante sa)er que la funciones en un script de )ash estn ms limitadas y se saltan algunas reglas que de)en cumplir en otros lenguajes de programacin$ y que cuando sea posi)le se de)eran intentar respetar% !a funciones de)eran tener un nom)re *nico$ es decir$ no de)era ha)er ninguna aria)le que se llamase igual. En )ash script$ sin em)argo$ te permite hacer esto " para acceder a la aria)le pones /-/ delante$ y si no$ accedes a la funcin. !as aria)les utili+adas en las funciones de)eran ser locales$ es decir$ existir slo para esa funcin$ y sin em)argo en )ash script a menos que nosotros le digamos que son locales$ todas
las aria)les sern glo)ales " accesi)les y modifica)les en cualquier parte del programa#. !a funciones de)eran poder de ol er un alor de cualquier tipo )sico que soporte el lenguaje "numrico$ cadena de texto$ etc...#. .in em)argo aqu estamos limitados a un n*mero entero entre > y 2]] solamente. Bormalmente se define la cantidad de parmetros que puede "y de)e# reci)ir una funcin "y muchas eces el tipo de parmetro tam)in#. Este no es el caso de )ash script$ en el cual podemos en iar a una funcin cualquiera una cantidad indeterminada de parmetros.
!o mejor de usar el do)le parntesis$ es que cuando ponemos una condicin lgica dentro de uel e un alor erdadero o falso$ con lo cual se hace posi)le utili+arlo como condicin$ para un if o para un )ucle Fhile por ejemplo% &'()in()ash iU> & Eontador desde iU> a iU; _hile 11 i 0 P 33 do if 11 1i U "3 44 ? 33 &Bumero par then echo \Bumero par% -i\ else &Bumero impar echo \Bumero impar% -i\ fi 11 i22 33 done Ltra posi)ilidad del do)le parntesis es la de poder hacer operaciones con aaria)les$ para mostrarlas por pantalla$ por ejemplo$ si tenemos una posicin de un array$ y queremos mostrar una posicin ms "para empe+ar desde la 9 y no desde la >#$ en ese caso se pone el sm)olo -$ seguido del do)le parntesis y la operacin dentro. Ejemplo%
for "" i U >^ i X -0& ectorRCS1^ iVV ## do echo \Elemento 511i2$33% -0 ectorR-iS1 \ done DDV: Ejemplo: Ejecutar instrucciones remotas )ajo el protocolo ssh. ,e)emos estar logados como usuario a en la mquina a. Ejecutamos% -sh8Key'en 8t rsa Este comando nos creara una serie de archi os en la carpeta .ssh del home del Wusuario aAUno de esos ficheros se llamar% 5VOHE%Assh%idXrsaApu( 7hora de)emos logarnos en el equipo ) como usuario ) y hacer un ftp al equipo a. Euando se nos solicite el user(pass_ord para el ftp introducimos los del equipo a. ftp N lcd %tmp ftpN m'et %home%usuarioXa%Assh% idXrsaApu( ftpN (ye 7hora ya tenemos el fichero en la carpeta (tmp del equipo ). cat %tmp%idXrsaApu( !! 5VOHE%Assh%authori@edXKeys Eon el comando anterior copiamos el contenido del fichero a un Bue o fichero en la carpeta .ssh del usuario. El *ltimo paso es dar los siguientes permisos% chmod ?-?? 5VOHE%Assh%chmod ?*?? 5VOHE%Assh%authori@edXKeys 7hora que ya hemos terminado la tarea$ de)emos pro)ar que todo ha ido )ien. ,esde el e)uipoXa y como usuarioXa hacemos: 5 sh usuarioX(Ye)uipoX( Esto de)e permitirnos acceder sin contraseAa. ,e)emos tener en cuenta que la primera e+ que lo hagamos se nos solicitar incluir el equipo remoto en el fichero <no_n8hosts. 6ecleamos yes y tenemos concluida la tarea. ODZE Es una utilidad tpica de los sistemas UBIa. !o primero que de)emos hacer es sa)er si la tenemos instalada ya en nuestra distri)ucin linux. !o ms facil para sa)er si esta instalada es ejecutarla desde linea de comandos y si lo est la instalamos desde aptMget o aptitude. Tsync nos a a permitir sincroni+ar carpetas dentro de una misma mquina o en mquinas
diferentes. Ejemplo de uso% .incroni+ar la carpeta del ser idor remoto con nuestra carpeta local. 5 rsync 8a&@ userXremotoYipXser&Xremoto:%carpetaXremota %carpetaXlocal 6am)in se puede utili+ar )ajo una conexin ssh sin utili+ar contraseAa% 5 rsync 8a&@ 8e 'ssh 8i %user%Assh%idXrsa' userYipXser&Xremoto:%carpetaXremota %carpetaXlocal% N[\A 7bc es en si mismo todo un lenguaje de programacin diseAado para tratar con textos. 5 ls 8lrta ] aFK 'Rprint 15*3S' .acar el sexto argumento de la lista de ficheros del directorio donde est. 5 ls 8lrta ] aFK 'Rprint 15* 5-3S' .acar el sexto y sptimo argumento de la lista de ficheros del directorio donde est. .e pueden agregar literales en a_<. 5 ls 8lrta ] aFK 'Rprint 1sexto ar'umento45* ar'umento-45-3S' .e pueden utili+ar separadores para tratar el fichero como una )ase de datos. 5 cat fichero ] aFK 8G: 'Rprint 15$ 5+3S' ^EOJ y ^VZ_OEA .on lenguajes de programacin orientados a scripting.