Está en la página 1de 40

Apuntes Bash

1-40

Índice de contenido

Ficheros BASH

3

Caracteres Especiales

3

Variables

5

Comillas

5

Estado de salida (exit status)

6

Comparadores

6

Operaciones

9

Variables

11

Internas

11

Pará metros posicionales

11

Otras variables

12

Manipulació n de cadenas

12

Evaluació n de variables y pará metros

13

Tipado de variables

14

Referencia indirecta

14

N ú meros Aleatorios

15

Bucles y Saltos

16

for

16

while

16

until

17

break, continue

17

case

17

select

17

Redirecciones

19

Redirecci ó n local (here documents)

20

Expresiones Regulares (RegExp)

21

Expansió n de nombres de fichero (globbing)

22

Sustitució n de procesos

22

Funciones

23

Arrays

24

Ficheros especiales: /dev/null y /dev/zeros

25

sed y awk

26

sed

26

awk

26

Comandos Internos

27

IO

27

Sistema de Ficheros

27

Variables

27

Comportamiento script

28

Apuntes Bash

2-40

Comandos

29

Control de trabajos

29

Filtros externos, programas y comandos

30

B

á sicos

30

Comandos complejos

31

Fecha y hora

31

Procesado de texto

32

Archivadores

33

Compresió n

34

Ficheros

34

Comparar ficheros

34

Utilidades de ficheros

34

Comunicaciones

35

Acceso Remoto

35

Varios

36

Comandos de Administració n y Sistema

37

Usuarios y grupos

37

Terminales

37

Informació n y estad ísticas

38

Logs

38

Procesos

38

Control de procesos

39

Red

39

Sistema de ficheros

39

Apuntes Bash

3-40

Ficheros BASH

Todo fichero bash debe comenzar en la primera l ínea con #!/bin/bash

Caracteres Especiales

#

comentario usado en eliminaciones ${

}

;

separador comandos en misma l ínea

 

;;

separador “case

in”

.

lee y ejecuta fichero script (como source) en expresi ó n regular, cualquier car á cter

 

evita interpretaci ó n, salvo $ (cita parcial)

evita interpretaci ó n (cita total)

 

,

enlaza operaciones aritmé ticas (entre dobles paré ntesis; el resultado es el de la ú ltima)

\

escape misma línea dividida

/

separador en rutas fichero divisió n (aritmé tica)

 

`

(backquote) ejecutar comando y sustituir por su salida (como $(

)

)

:

NOP (ejemplo

‘: > fichero’ => crea o trunca fichero)

 

!

negació n indirecci ó n de variables (ejemplo:

${!indir} evalú a la variable con nombre $indir)

invoca mecanismo de historia

 

*

comod í n en globbing (expansi ó n de nombre de fichero): cualquier conjunto de caracteres

**

en expresiones regulares (regexp): repite expresi ó n anterior 0 o n veces multiplicació n (aritmé tica) potencia (aritm é tica)

?

en globbing: cualquier car á cter en regexp: 0 o 1 repetició n de la expresi ó n previa

 

$

eval ú a variable

en regexp: fin de línea

${

}

sustituci ó n de expresi ó n

$*

todos los pará metros (como una sola cadena)

$@

 

todos los pará metros (como n cadenas)

$?

exit status

$$

pid

(

)

grupo de comandos en subshell inicializador de arrays (con espacios como separador)

{expr1, expr2, expr3

}

en globbing, conjunto de expresiones alternativas para coincidencia

{

}

bloque de có digo (con posibilidad de redirigir IO)

{}

nombre de cada fichero (con ruta completa) encontrado en find (para la opció n ­exec)

Apuntes Bash

4-40

[

]

devuelve ok si la expresió n es cierta (equivale a /usr/bin/test, pero es comando interno) í ndice elemento en arrays en regexp, conjunto de caracteres alternativo

[[

]]

test extendido (admite má s flexibilidad que [

])

((

))

evaluació n de enteros

>

redirecció n de stdout

&> redirecció n de stdout y stderr >&2 redirecció n de stdout a stderr >> redirige y a ñ ade (sin truncar si ya existe)

<(

)

sustituci ó n de procesos

>(

)

sustituci ó n de procesos

>

comparador cadenas y enteros

<

comparador cadenas y enteros

<< redirecció n para procesos interactivos

\<

en regexp, inicio de palabra

\>

en regexp, fin de palabra

|

pipe

>|

fuerza la redirecci ó n

||

OR ló gico

&

ejecució n en segundo plano

&&

AND l ó gico

­

opció n de comando

suma (aritm é tica)

}

=

stdin/stdout en redirecciones $OLDPWD (ej: ‘cd ­’ cambia al directorio anterior) menos (aritm é tica) asignació n

+

comparaci ó n

%

en regexp, repetir una o má s veces la expresi ó n anterior opció n de comando m ó dulo (aritmé tica)

usado en eliminaciones ${

~

$HOME

~+

$PWD

$OLDPWD

^

en regexp, inicio lí nea. Negació n dentro de [] en globbing, negació n dentro de []

Apuntes Bash

5-40

Variables

Asignaci ó n:

= (sin espacios)

ej:

variable=hola

Evaluació n:

ej.

variable2=”hola”

$

variable3=$variable2

variable4=${variable3}

o

${

}

( é ste evita ambig ü edad)

Pará metros posicionales: los que se pasan al comando o funció n.

$0 nombre de comando

$1

$9 pará metros

${10}

pará metros

$*, $@

todos los pará metros en conjunto

$# numero de pará metros (excluyendo el nombre de comando)

referencia indirecta:

var=7

var2=${!var}

asigna a var2 el 7º par á metro

shift: sentencia que pasa $2 a $1, $3 a $2 y así sucesivamente, perdié ndose el primer pará metro

Comillas

Partial quoting (comilla doble): Mantienen los espacios. Interpretan $, ` (backquoting), \ (escape)

ej: #!/bin/bash

var=”a

b c”

echo $var

# => a b c

 

echo “$var”

# =>

a

b c

Full quoting (comilla simple): No interpreta s ímbolos

ej: var1=”hola”; var2=”$var1”; var3=’$var1’

echo “$var1 $var2 $var3” #=> hola hola $var1

con $ delante, interpreta caracteres de escape

ej: echo $’\a’ equivale a echo ­e “\a”

Apuntes Bash

6-40

Estado de salida (exit status)

Comando exit nnn (0­255) ­> 0 ok, 1­255 error El s ímbolo $? tiene el estado de salida de la ú ltima instrucció n

El comando exit sin pará metros equivale a exit $? El s ímbolo ‘!’ má s espacio má s comando invierte el estado de salida ej: #!/bin/bash

! echo hola echo $? echo $?

# => hola # => 1 (error) # => 0 (ok)

Comparadores

Sentencia if

then

elif

then

else

fi

if comprueba el estado de salida de la sentencia. Si ok ($? es 0), ejecuta then.

Ej:

#!/bin/bash if cmp a b &> /dev/null then

# compara los ficheros a b con salida silenciosa # si son iguales

echo “a y b son iguales”

else

echo “a y b son distintos”

fi

Operadores para comparaciones

[

]

equivale a /usr/bin/test, salvo que es un comando interno (builtin)

[[

]] extiende la funcionalidad del anterior. No es un comando, sino una palabra clave.

let

evalú a expresiones aritm é ticas

((

)) evalú a expresiones aritm é ticas

Operadores sobre fichero: IMPORTANTE: todos deben ir precedidos y seguidos de ESPACIO

­e

existe. Ej: if [ ­e /etc/passwd ]; then cat /etc/passwd; else echo “no existe”; fi

­f

es fichero regular

­s

no tiene longitud 0

­d

es directorio

Apuntes Bash

7-40

­b ­c ­p ­h, ­L ­S ­t ­r ­w ­x ­g ­u ­k ­O ­G ­N f1 ­nt f2 f1 ­ot f2 f1 ­ef f2 !

es dispositivo de bloque es dispositivo de caracteres es un pipe es enlace simb ó lico es un socket es un terminal (va con descriptor, no con nombre) tiene permiso de lectura para usuario efectivo tiene permiso de escritura para usuario efectivo tiene permiso de ejecució n para usuario efectivo

tiene setgid activado (tiene permiso para cambiar el grupo efectivo a root) tiene setuid activado (tiene permiso para cambiar el usuario efectivo a root) tiene sticky bit activado (mantener en cache) usuario efectivo es propietario grupo efectivo igual al del fichero fecha de ú ltima modificació n posterior a la de ú ltimo acceso

f1 posterior f2 (newer than) f1 anterior f2 f1 y f2 son enlaces fuertes (hard links) al mismo fichero negació n

Operadores de enteros:

Con corchete [ “$a” ­operador “$b” ]

­eq

­ne

­gt

­ge

­lt

­le

igual distinto mayor mayor o igual menor menor o igual

igual distinto mayor mayor o igual menor menor o igual
igual distinto mayor mayor o igual menor menor o igual
igual distinto mayor mayor o igual menor menor o igual
igual distinto mayor mayor o igual menor menor o igual
igual distinto mayor mayor o igual menor menor o igual

Con doble paré ntesis (( “$a” operador “$b” )) <

<=

menor menor o igual

Apuntes Bash

8-40

>

mayor

>=

mayor o igual

Operadores de cadenas: con corchete o doble corchete.

=, ==

cadenas iguales. Con doble corchete, admite patrones

 

ej: var="hola"

 
 

if [ $var = h* ]; then echo sí ; else echo no; fi # => no

if [[ $var = h* ]]; then echo sí ; else echo no; fi # => s í

if [[ $var = “h*” ]]; then echo s í; else echo no; fi # => no (ajuste exacto)

 

Las comillas dobles son ú tiles para preservar espacios

 

ej:

var1="a

b"; var2=”a b”

 

if [ $var1 = $var2 ]; then echo s í; else echo no; fi # => error (too many args)

if [[ $var1 = $var2 ]]; then echo s í; else echo no; fi # => no

if [ "$var1" = "$var2" ]; then echo s í; else echo no; fi # => no

!=

cadenas distintas. Mismos comentarios que el anterior

 

>, <

mayor, menor (alfab é ticamente). Con corchete simple requiere \ (escape)

ej:

var1=”a”; var2=”b”

 
 

if [ $var1 \< $var2 ]; then echo sí ; fi

# => s í

if [[ $var1 < $var2 ]]; then echo s í; fi

# => s í

­z

cadena de longitud cero o sin declarar (null)

­n

cadena de longitud mayor que cero

Operadores ló gicos

­a AND

­o

En corchetes dobles o en listas de comandos

&& AND

||

Listas de comandos: debido a la ejecuci ó n perezosa, el operador && puede encadenar comandos hasta el primer retorno de estado no ok. De la misma forma, || encadena comandos hasta el primer ok

OR

OR

Apuntes Bash

9-40

ejemplo:

[ ­e “$fichero” ] && cat “$fichero”

equivale a

if [ ­e “$fichero” ]; then cat “$fichero”; fi

Operaciones

Asignaci ó n de variables

Aritmé tica entera

=

+, ­, *, /, **, %

+=, ­=, *=, /=, %=

Para evaluar expresiones aritmé ticas se ha de usar let, expr o ((

Ejemplo: #!/bin/bash

a=1;b=2

let a=a+b; echo $a

# 3

a=`expr $a + $b`; echo $a

# 5

((a=a+b)); echo $a

# 7

: $((a=a+b)); echo $a

# 9

))

Los enteros en bash suelen ser con signo de 4 bytes

Arimé tica de coma flotante: En bash no existen las variables de tipo coma flotante. Son cadenas. Para ejecutar este tipo de cá lculos necesitamos el comando bc, habitualmente en pipe

ejemplo #!/bin/bash

a=0.16; b=15

c= `echo “scale=0; $b ^ $a” | bc`

variables para bc:

# backquote para ejecutar y dejar stdout #como pará metro del siguiente comando

scale indica el n ú mero de decimales

ibase, obase indican las bases en las que se representan los datos de entrada y de salida respectivamente (por defecto, 10)

last ú ltimo n ú mero impreso

Operadores a nivel de bit:

Otros operadores

,

Constantes num é ricas

<<, >>, <<=, >>=, &, &=, |, |=,~, ~=, ^, ^=

la coma entre doble paré ntesis ejecuta varias operaciones aritmé ticas y devuelve el resultado de la ú ltima

Apuntes Bash

10-40

decimal

let “x=32”

octal

let “oc=032”

hex

let “hx=0x32Fa” #tambi é n se admite 0X

otras bases

let “bin=2#0100101”

m áxima base 64, que usa 10 d ígitos, 26 min ú sculas, 26 may ú sculas, @ y _

Apuntes Bash

11-40

Variables

Internas

$EUID

usuario efectivo

$FUNCNAME

nombre de la funció n actual (para depuraci ó n)

$GROUPS

lista de grupos a la que el usuario pertenece

$HOME

directorio de trabajo del usuario

$HOSTNAME

an álogo a ejecutar /bin/hostname

$IFS

internal field separator. Las separaciones de palabras y campos se llevan a cabo usando los caracteres aqu í definidos como lí mites. Se puede modificar con los testigos que nos interesen en cada caso para hacer divisió n de cadenas.

$LINENO

contiene la línea actual del script (para depuració n ej. echo “voy por $LINENO”)

$OLDPWD

pen ú ltimo en el hist ó rico de directorios actuales

$PATH

conjunto de rutas (separadas por :) en las que se buscan ejecutables

ej: PATH=$PATH:/nuevodirectorio

$PPID

pid del proceso padre

$PROMPT_COMMAND

comando ejecutado antes de imprimir el prompt principal PS1

$PS1

prompt principal

$PS2

prompt secundario. Para líneas de entrada adicionales (normalmente ‘>’)

$PS3

mostrado en la sentencia select

$PS4

cuando se invoca un script con ­x, opci ó n xtrace que imprime cada comando antes de ejecutarlo (normalmente ‘+’ )

$PWD

directorio actual

$REPLY

en read, cuando no hay variable como pará metro, contiene el dato leí do

en men ú s select; contiene el n ú mero de item

$TMOUT

tiempo para logout ( ú til para realizar lecturas read con tiempo limitado)

$UID

usuario

Parámetros posicionales

$0

nombre del script

Apuntes Bash

12-40

$1, $2

$9

pará metros del 1 al 9

${10}, ${11}

a partir de dos cifras se exige ${}

$#

n ú mero de pará metros (excluyendo el nombre de script)

$*

todos los pará metros (como una cadena)

$@

todos los pará metros (como $# cadenas)

Otras variables

conjunto de flags

$!

PID del ú ltimo trabajo en segundo plano

$_

ú ltimo par á metro del ú ltimo comando invocado

$?

exit status del ú ltimo comando

$$

PID del proceso actual ( ú til por ejemplo para construir nombre ú nicos temporales)

Manipulación de cadenas

Longitud de una cadena

${#cadena}

expr length $cadena

expr “$cadena” : '.*'

Longitud de coincidencia de expresiones regulares

expr match “$cadena” “$regexp”

expr “$cadena” : “$regexp”

B ú squeda de caracteres: encuentra la posició n ( í ndice base 1) del primer cará cter que coincida

expr index “$cadena” “$conjuntoDeCaracteres”

Extracció n de subcadenas

${*:posicion} # pará metros posicionales desde posicion en adelante

${@:posicion} # pará metros posicionales desde posicion en adelante

${cadena:posicion} # desde posici ó n al final

${cadena:posicion:longitud} # desde posició n, 'longitud' caracteres

${cadena: ­ longitud} # 'longitud' ú ltimos caracteres

expr substr “$cadena” “$posic” “$longitud”

Apuntes Bash

13-40

expr match “$cadena” “\($regexp\)” # extracció n desde el inicio

# extracció n desde el inicio

expr “$cadena” : “\($regexp\)”

Borrado

 

${cadena#regexp} #borra la primera coincidencia má s corta

${cadena##regexp} #borra la primera coincidencia má s larga

${cadena%regexp} #borra la ú ltima coincidencia má s corta

${cadena%%regexp} #borra la ú ltima coincidencia má s larga

Sustitució n

${cadena/regexp/cadenaSustituye} #sustituye la primera coincidencia

${cadena//regexp/cadenaSustituye} #sustituye todas las coincidencias

${cadena/#regexp/cadenaSustituye} #sustituye si la coincidencia se produce #desde el primer cará cter

${cadena/%regexp/cadenaSustituye} #sustituye si la coincidencia se produce # desde el ú ltimo cará cter

Evaluación de variables y parámetros

En todos los casos var puede ser una etiqueta alfanumé rica o un n ú mero, indicando en este ú ltimo caso un pará metro posicional.

$var

devuelve valor de var

${var}

devuelve valor de var

${var­defecto}

devuelve valor de var. Si no definida (null), devuelve 'defecto'

${var:­defecto}

devuelve valor de var. Si no definida (null), devuelve 'defecto'

${var=defecto}

devuelve valor de var. Si no definida (null), devuelve 'defecto' y se lo asigna a var

${var:=defecto}

devuelve valor de var. Si no definida (null), devuelve 'defecto' y se lo asigna a var

${var+otro}

si var est á definida, devuelve 'otro'. Si no, devuelve null

${var:+otro}

si var est á definida, devuelve 'otro'. Si no, devuelve null

Apuntes Bash

14-40

${var?mensajeError} si var est á definida, devuelve su valor. Si no, imprime 'mensajeError'

${var:?mensajeError}

si var está definida, devuelve su valor. Si no, imprime 'mensajeError'

Tipado de variables

Las variables no tienen tipado fuerte. Para definir una variable, simplemente se inicializa a un valor y actú a con el tipo de la constante asignada. Posteriormente se le puede asignar otra constante de otro tipo.

Ejemplo:

#!/bin/bash

a=123456

let “a=$a + 100000”

echo `expr $a : '\(.*3\)'` # => 223

En todo caso, se puede restringir su uso con typeset o declare (son sin ó nimos)

Constantes:

declare ­r var

readonly var

Enteros:

declare ­i var

Arrays:

declare ­a var

Funciones:

declare ­f nombreFuncion

 

declare ­f

lista las funciones definidas hasta el momento

Para exportar:

declare ­x var

permite inicializar en la misma línea de declaració n

Referencia indirecta.

eval

${!varIndirecta}

Ejemplo:

\$$varIndirecta

#!/bin/bash

cad=”hola”

indir=”cad”

eval echo \$$indir

# => hola

Apuntes Bash

15-40

echo ${!indir}

# => hola

Números Aleatorios

Variable RANDOM. Inicializar la semilla aleatoria (p.ej. usar pid) Evaluar $RANDOM da un entero entre 0 y 32767

RANDOM=$$

Apuntes Bash

16-40

Bucles y Saltos

for

for var [in lista] #si se omite lista, se usa $@

o bien

do

done

for ((

do

done

cmd

cmd

a=1 ; a < 10 ; a++ ))

Ú tiles

set ­­ $var divide var en palabras y las asigna a $1, $2

se puede usar expansió n de nombres de fichero (globbing)

for fich in ./*

while

# para cada fichero en el directorio actual

while condició n # al igual que if, la condició n es una sentencia y se mira su exit status

do

done [<fichEntrada] [>fichSalida]

Las redirecciones de entrada y salida son muy interesantes para hacer bucles de lectura con read. Ejemplo:

while read lineaFichero

do

echo “$lineaFichero”

done < fichero

Apuntes Bash

17-40

until

An á logo al anterior

break, continue

Sin pará metros funcionan como en C

break n sale de n niveles de anidamiento

continue n sale de n­1 niveles de anidamiento y contin ú a en el siguiente ciclo del bucle exterior

case

case “$var” in

$valor1[|$valor2 ])

)

;;

# indica finalizació n este caso

*)

esac

;;

;;

# caso por exclusió n

Los valores pueden llevar comodines (*), pero entonces no deben llevar comillas. Las comillas no son necesarias porque no hay divisi ó n de palabras.

select

select var [in lista]

do

 

cmd

break

done

Apuntes Bash

18-40

Presenta un men ú con lista. Se elige mediante n ú mero, var se actualiza a ese valor y se ejecuta la secuencia de comandos.

Apuntes Bash

19-40

Redirecciones

Los descriptores de fichero son ficheros especiales en /dev/fd/<num>, siendo 0, 1, 2 respectivamente asignados a stdin, stdout y stderr

:> fich

trunca fichero fich (an á logo a touch fich, pero no arranca un subproceso)

>>

redirige para añ adir (no trunca fich si existe)

> fich

redirige stdout a fich (truncando fich si exite)

1> fich

redirige stdout a fich (truncando fich si exite)

>> fich

redirige stdout a fich para añ adir datos (no trunca fich si exite)

1>> fich

redirige stdout a fich

para añ adir datos (no trunca fich si exite)

2>

redirige stderr

&>

redirige stdout y stderr

2>&1

redirige stderr a stdout

num1>&num2

redirige el descriptor num1 al descriptor num2

0< fich

redirige stdin a fich

< fich

redirige stdin a fich

num<> fich

asigna el descriptor num al fichero fich para el comando actual

exec num<> fich

exec num>&­

asigna el descriptor num al fichero fich para el resto de las sentencias

cierra el descriptor num

Bucle típico de lectura de lí neas

while read var

do

echo $var

done < fichOrigen > fichDestino

Apuntes Bash

20-40

Redirección local (here documents)

El operador ‘<<’ redirige la entrada stdin para un comando interactivo a las líneas que se escriban a continuació n, hasta una cadena que marca el fin de lectura

comandoInteractivo << cadenaLimite

l

ínea1

l

ínea2

l

ínea3

cadenaLimite

Una utilidad de esto puede ser comentar varias l íneas

ejemplo

: << comentario

comentario uno

Esto es otro comentario

comentario

Apuntes Bash

21-40

Expresiones Regulares (RegExp)

Para sed, grep y awk

*

coincidencia 0­n del cará cter o RE previa

.

coincidencia para un cará cter cualquiera (salva retorno de carro)

^

principio de lí nea

^

(dentro de corchetes) complemento de rango

$

fin de lí nea

[

]

rango o conjunto para coincidencia de un car á cter

\

marca de car á cter de escape

\<

\>

l ímites de palabra

Conjunto extendido de expresiones (para egrep, sed y awk)

?

coincidencia 0­1 del cará cter o RE previa

+

coincidencia 1­n del cará cter o RE previa

\{num\}

coincidencia num del car á cter o RE previa. Ej: [0­9]\{5\} equivale a cinco d ígitos

(

|

|

)

grupos de RE alternativos

Clases POSIX (admitidas en expresiones regulares extendidas, aunque a veces hay que usar doble cochete)

[:alnum:]

0­9a­zA­Z

[:alpha:]

a­zA­Z

[:blank:]

\ \t (espacio y tabulador)

[:cntrl:]

caracteres de control

[:digit:]

0­9

[:graph:]

caracteres imprimibles y espacio

[:print:]

caracteres imprimibles (excluyendo espacio)

[:lower:]

a­z

[:space:]

[:blank:]

[:upper:]

A­Z

[:xdigit:]

0­9a­fA­F (d ígitos para hexadecimal)

Apuntes Bash

22-40

Expansión de nombres de fichero (globbing)

Bash no interpreta por s í mismo expresiones regulares (se usan como par á metros para algunos comandos), aunque s í lleva a cabo expansi ó n de nombres de fichero

*

cualquier conjunto de caract é res (excluyendo comienzo por ‘.’)

?

cualquier car á cter

[

]

un conjunto para coincidencia de un cará cter.

 

Ejemplo: ls ­ld [a­em]*

lista todos los ficheros y directorios que comienzan por a, b, c, d, e, m

^

complemento de un rango

{patron1, patron2,

}

Ejemplo: ls ­ld {h?h, a*}.c

conjunto alternativo de patrones

lista todos los ficheros que finalicen por ‘.c’ y que, o bien comiencen por ‘a’, o bien tengan dos ‘h’ y en medio cualquier car á cter

Sustitución de procesos

En los siguientes casos, cmd se ejecuta primero, redirigiendo su salida como pará metro de sentencia, que se ejecuata a continuació n

sentencia `cmd`

sentencia $(cmd)

Ejemplo:

var=`ls`

#$var contiene los ficheros y directorios del directorio actual

Cuando se tiene como par á metro un fichero, se pueden usar las expresiones <(cmd) o >(cmd), dependiendo si el fichero es un parametro de lectura o escritura.

sentencia <(cmd)

sentencia >(cmd)

Ejemplo: Comparar los directorios /home/pepe y /home/manolo con diff

diff <(ls /home/pepe) <(ls /home/manolo)

Ejemplo: Imprimir selectivamente la tabla de enrutamiento

while read des what mask iface; do

Apuntes Bash

23-40

echo $des $what $mask $iface

done < <(route n)

Funciones

function nombreFuncion {

<cuerpo>

}

o bien

nombreFuncion() {

<cuerpo>

}

Los pará metros no se definen entre los paré ntesis. En el cuerpo se invocan por $1, $2

posicionales), y son siempre de tipo global. Para invocar la funció n los par á metros se colocan a continuació n separados por espacios (sin par é ntesis).

(pará metros

Ejemplo:

#!/bin/bash

miFun(){

var2=”adios”

eval $1="pepe";

}

var="hola"

miFun var

echo $var2 $var

# => adios pepe

Se pueden definir variables locales con la palabra reservada local.

La palabra reservada return <num> modifica $? (estado de retorno), que puede ser consultado por el script que invoca la funció n.

Apuntes Bash

24-40

Arrays

Los arrays tienen como primer índice el 0 (como en C)

Declaraci ó n: <nombre>[<tamano>]

o bien

declare ­a <nombre>

Invocació n: ${<nombre>[< índice>]} (operador ${ })

Asignaci ó n: <nombre>[< índice>]=valor

Inicializaci ó n: <nombre>=(valor1 valor2

)

(paré ntesis y valores separados por espacios)

o bien

Longitud:

o bien

<nombre>=([2]=valor1 [7]=valor2

${#<nombre>[@]}

)

(inicializaci ó n selectiva por í ndices)

${#<nombre>[*]}

NOTA:

${#<nombre>} es la longitud del primer elemento del array!

Extracció n de elementos:

${<nombre>[@]:<indiceInicial>}

${<nombre>[@]:<indiceInicial>:<numeroElementos>}

Operaciones:

read ­a nombreVector

lee una l ínea de stin, la divide en palabras seg ú n IFS y cada una se la asigna al elemento correspondiente del vector nombreVector

Ejemplos:

Sustituir ú ltimo elemento

miVector=( a b )

miVector[ ${#miVector[@]} ­ 1 ]="hola" # obsé rvese que no necesita ((

echo ${miVector[@]}

# => a hola

Eliminar ú ltimo elemento

)) para cá lculo

miVector=( a b )

unset miVector[ ${#miVector[@]} ­ 1 ] # obsé rvese que no necesita ((

echo ${miVector[@]}

# => a

)) para cá lculo

Apuntes Bash

25-40

Ficheros especiales: /dev/null y /dev/zeros

/dev/null act ú a como “agujero negro” Ejemplo: eliminar la salida error.

comando

2> /dev/null

/dev/zeros actú a igualmente, pero tambi é n sirve para inicializar a 0 binario

Ejemplo: creaci ó n de un á rea de intercambio inicializada a 0 binario dd if=/dev/zero of=$fich bs=1024 count=4096 mkswap $fich 4096 swapon $fich

Apuntes Bash

26-40

sed y awk

sed

Editor no interactivo de lí nea. Lee cada lí nea de stdin, la procesa y la escribe en stdout.

Se definen rangos con un pará metro o dos separados por una coma. El pará metro puede ser un

n ú mero (de l ínea) o un patró n de coincidencia (expresi ó n regular).

Si s ó lo hay un pará metro, se ejecutará el comando sobre todas las líneas coincidentes (s ó lo una si es un n ú mero de l ínea o todas las que contengan la expresi ó n regular)

Si hay dos pará metros, el rango queda definido por la primera coincidencia del primer par á metro y, a partir de ese punto, la primera coincidencia del segundo.

Para realizar varias operaciones sobre un rango (o definir subrangos) se usan llaves. Ejemplo:

Imprimir, de entre los cuatro primero archivos, aquellos que comiencen por ‘a’, ‘b’ o ’c’.

ls ­1| sed ­n 1,4{/[a­c].*/p}

(NOTA: ls ­1 (n ú mero ‘1’, no letra ‘l’) imprime usando una columna)

(NOTA2: sed imprime por defecto todas las l íneas a stdout, con independencia de la instrucció n que se ejecute. ­n se usa para eliminar esta salida)

Operaciones

[rango]/d

no imprime las l íneas coincidentes en rango

[rango]/p

no imprime las l íneas coincidentes en rango

[rango]s/regexp/cadena/

[rango]s/regexp/cadena/g

[rango]y/conjunto1/conjunto2/

sustituye la primera coincidencia de regexp por cadena

sustituye todas las coincidencias de regexp por cadena

sustituye la primera coincidencia de caracteres del primer conjunto por el correspondiente en el segundo conjunto (an álogo a tr)

sustituye todas las coincidencias de caracteres del primer conjunto por los correspondientes en el segundo conjunto.

[rango]y/conjunto1/conjunto2/g

awk

Nos vamos a limitar a la funcionalidad de cortar en campos (m á s vers á til que cut).

Ejemplo: Imprimir los campos 1 y 3 del fichero fichero

cat fichero | awk ­F ‘\t’ ‘{print $1 “\t” $3}’

Si se omite la especificació n de delimitador (­F), el delimitador será el espacio

Apuntes Bash

27-40

Comandos Internos

Un comando interno (builtin) de bash no requiere arrancar un subproceso.

IO

echo

imprime texto en stdout

­e

reconoce caracteres de escape

­n

no imprime retorno de carro al finalizar

printf cadenaFormato param1 param2

an álogo en C

read [var [, var2

]]

lee una lí nea de stdin y la asigna a var.

si var se omite, el valor queda en $REPLY.

si se redirige la entrada, se lee la primera l ínea.

si hay varias variables, se lleva a cabo la divisió n de la lí nea seg ú n IFS y cada campo se le asigna a cada variable. A la ú ltima se le asigna el resto.

­a

divide la l ínea y la asigna a un array

­s

no hay eco en stdout

­nNN

lee má ximo NN caracteres

­p

escribe texto de pregunta

­t secs establece un tiempo de espera de secs segundos

Sistema de Ficheros

cd nuevoDirectorio

pwd

cd ­

cambia pwd a nuevoDirectorio

cambia a $OLDPWD

imprime $PWD (directorio actual)

Variables

let

expresiones aritmé ticas

eval

expansió n y conversió n a comando

ej: a=”echo hola”; eval “$a” # => hola

set

sin pará metros

lista las variables de entorno

­­ $var

establece pará metros posicionales seg ú n la divisió n de $var

­­

borra los pará metros posicionales

Apuntes Bash

28-40

`comandos`

ejecuta comandos y redirige su salida para establecer los pará metros posicionales

ej: set `echo hola`; echo $1 # => hola

unset var

borra var (pasa a valer null)

export var

establece var como variable de entorno para procesos hijos

declare/typeset

establece tipo de variable

readonly

establece tipo constante

getopts

para leer opciones (flags seguidos de guiones)

$OPTIND

indica el pará metro posicional donde se encuentra la siguiente opció n

$OPTARG

para las opciones que requieren ir seguidas de un par á metro, el valor de dicho pará metro

Ejemplo:

while getopts “:abc:d” opcion

# los dos puntos tras c indican que esa # opció n requiere par á metro

do

 

case $opcion in

 
 

a)

echo “$opcion”

# a

 

;;

 

b)

echo “$opcion”

# b

 

;;

 

c)

echo “$opcion $OPTARG”

# c <valorPar á metro>

 

;;

 

d)

echo “$opcion”

# d

 

;;

 

esac

done

Comportamiento script

. (punto) | source

exit n

el punto y la palabra reservada source son sin ó nimos. Son an á logos a #include en C

finaliza con exit status n

Apuntes Bash

29-40

exec cmd

shopt

Comandos

finaliza el script actual y lanza en su lugar cmd

cambia opciones shell

true

pone $? a 0 (ok)

false

pone $? a 1 (error)

type [cmd]

ruta completa del comando (si es externo)

­a

Control de trabajos

describe si es keyword (palabra clave) o builtin (comando interno) o si comando externo (describe la ruta completa)

fg

trae proceso en segundo plano a primer plano

bg

reinicia un proceso bloqueado en segundo plano

wait

espera a todos los procesos hijos lanzados en segundo plano

 

pid

espera al hijo con el pid indicado

%job

espera al hijo con el n ú mero de tarea indicado

kill

­l

imprime la lista de señ ales.

[­num]

pid

manda la se ñ al num (por defecto, SIGTERM) al proceso con pid indicado

 

%job

manda la se ñ al num (por defecto, SIGTERM) al proceso con n ú mero de tarea indicado.

Apuntes Bash

30-40

Filtros externos, programas y comandos.

Básicos.

ls [patr ó n]

lista ficheros y directorios ordenados alfab é ticamente

 

­a

incluye ficheros que comienzan por .

­l

informaci ó n completa

­R

lista directorios recursivamente

­S

ordenados por tama ñ o

­t

ordenados por tiempo

­i

muestra inodes

­F

muestra etiqueta con tipo de fichero

cat fich [fich2

]

imprime el contenido de los ficheros consecutivamente en stdout

­n

incluye n ú mero de lí nea

­b

no imprime líneas blancas

­v

muestra caracteres no imprimibles con ^

­s

si hay varias líneas blancas consecutivas, s ó lo imprime una

tac

an álogo a cat, pero imprime desde la ú ltima lí nea a la primera

rev

imprime línea a lí nea desde el principio, pero invierte cada l ínea (hola­>aloh)

cp orig dest

copia el fichero orig en dest, truncando caso de que exista este ú ltimo

 

­d

copia los enlaces simb ó licos como tal (no los ficheros a los que apunta)

­p

preserva permisos tanto como sea posible

­r

copia directorios recursivamente (copia mal FIFOs y ficheros especiales!)

­R

copia directorios recursivamente

­a

equivale ­dpR (copia recursiva respetuosa con enlaces y permisos)

rm fich

borra fichero fich

 

­f

no pregunta confirmació n (bueno para script)

­r

directorios recursivamente (bueno para borrar á rboles completos)

rmdir dir

borra directorio vacío

mkdir dir

crea directorio

chmod numOctal fich cambia los permisos de fich. Tres d í gitos en octal indican rwx de propietario, grupo y resto

Apuntes Bash

31-40

{u,g,o,a}{+,­}{r,w,x} fich

ejemplo: chmod u+w fich a ñ ade permisos de escritura para el propietario

­R

recursivamente

ln fichero enlace

crea enlace para fichero

­s

enlace simb ó lico

Comandos complejos

find <dir> [­name <patr ó n>] [­type <tipo>] [­exec <comando> \;]

busca coincidencias patró n recursivamente en dir, ficheros de tipo tipo, y ejecuta con cada uno comando (se le puede pasar ‘{}’ como argumento equivalente al nombre de fichero encontrado). Por defecto, lo imprime.

ejemplo: find “$dir” ­type f ­atime +5 ­exec rm {} \;

esto borra los ficheros regulares (f) en el directorio $dir con tiempo de acceso mayor que cinco d í as de diferencia con la fecha actual

xargs cmd

­n N

ejecuta cmd con los pará metros que se indican en stdin

n ú mero de pará metros que se pasará n al comando (si sobran, se ejecuta de nuevo)

expr

ejemplo: ls | xargs ­n 1 echo

lista el directorio en una columna

v é ase en Manipulació n de Cadenas

Fecha y hora

date

fecha

 

­u

UTC

+<formato>

ejemplo: date +”%Y %m” # => 05 12

touch fich

crea fich con longitud 0

at <fecha> [­f <ficheroListaTrabajos>] si se omite ­f, se espera la lista de trabajos de stdin

ejecuta una lista de tareas en la fecha indicada (mejor usar cron)

sleep num

bloquea el proceso num segundos

usleep num

bloquea el proceso num microsegundos

hwclock, clock

reloj hw (acceso y modificació n)

Apuntes Bash

32-40

Procesado de texto

sort [fich[ fich2]

ordena líneas ficheros e imprime stdout (si se omiten ficheros, stdin)

uniq

borra líneas duplicadas

­c

incluye el n ú mero de apariciones de cada l ínea

expand, unexpand

cut

convierten tabuladores a espacios y a la inversa

extracci ó n de campos (mejor usar awk)

­f num campo num

­d “$delimitadores”

­c num1­num2

especifica delimitadores de separació n de campos

extrae caracteres entre las columnas num1 y num2 (se ignora la separaci ó n por delimitadores)

paste fich1 fich2

join fich1 fich2

head [­n num] fich

imprime cada l ínea consistente en la l ínea correspondiente de cada fichero separadas por tabuladores

une lí neas seg ú n el primer campo de lí nea igual (el primer campo act ú a a modo de clave primaria en un join natural)

imprime num l íneas iniciales de fich (10 por defecto)

tail fich

­c num imprime num caracteres

­f

an álogo a head, pero del final

va imprimiendo el final a medida que va creciendo el fichero (muy bueno para observar ficheros log).

grep regexp ficheros extrae las l íneas donde existe alguna coincidencia de regexp en ficheros

­i

ignora caso

­w

coincidencia palabras completas

­l

s ó lo lista los archivos donde hay coincidencias, no las lí neas.

­r

recursivamente los directorios

­n

imprime n ú meros de l ínea

­v

inversi ó n: imprime donde NO hay coincidencia

­c

s ó lo imprime el n ú mero de coincidencias

­E

equivale a egrep: admite expresiones regulares extendidas

­F

equivale a fgrep: no se admiten expresiones regulares, s ó lo coincidencias exactas

para ficheros comprimidos

zgrep, zegrep, zfgrep versiones para fichero gzip

Apuntes Bash

33-40

 

bzgrep

versi ó n para ficheros bzip, bzip2

sed

ver apartado Sed y Awk

awk

ver apartado Sed y Awk

wc

cuenta lí neas, palabras y caracteres

 

­w

s ó lo palabras

­l

s ó lo líneas

­c

s ó lo caracteres

­L

longitud de la línea má s larga

tr rango1 rango2

sustituye los caracteres de rango1 por los correspondientes de rango2, leyendo de stdin e imprimiendo en stdout

ejemplo:

tr A­Z a­z < fichero

imprime fichero todo min ú sculas

­d rango1

no imprime los caracteres en rango1

­c rango

rango se convierte en su complementario (ej. ‘­c a’ sería ‘todo excepto a’)

nl

Archivadores

equivale a cat ­n (pinta con n ú meros de línea) salvo que no imprime l íneas en blanco

tar

para archivos tarball

 

­c

crear archivo

­x

extraer archivo

­­delete fich

eliminar fich del archivo

­r fich a ñ adir fich en el archivo

­A arch

a ñ adir archivo tar arch al archivo

­t

lista los ficheros del archivo

­u

actualiza

­d

compara el contenido del archivo con el de un sistema de ficheros

­z

fichero gzip (con ­c comprime, con ­x descomprime)

­j

fichero bzip

rpm

Red Hat Package Manager. Para instalar paquetes Red Hat

 

­i

instalar

Apuntes Bash

34-40

­qa

lista paquetes instalados

Compresión

gzip, gunzip (equivale gzip ­d) bzip2, bunzip compress, uncompress sq, unsq

zip, unzip

maneja los ficheros MS­DOS zip generados por pkzip

unarc, unarj, unrar

descomprimen los ficheros correpondientes MS­DOS

Ficheros

file <fich>

muestra el tipo de fichero

which <fich>

muestra la ruta completa del fichero

whereis <fich>

muestra la ruta completa del fichero y la correspondiente p á gina del manual

whatis <fich>

muestra ayuda sobre el fichero

vdir

ls ­l

locate, slocate

busca la ruta en una base de datos del sistema actualizada perió dicamente

readlink

muestra a qu é fichero apunta un enlace

strings

busca cadenas de texto en archivos binarios, de datos, dumps

Comparar ficheros

diff f1 f2 cmp f1 f2

­s

compara lí nea a línea y pinta la l íneas distintas informa del primer punto (l ínea y byte) donde ambos difieren no imprime nada. S ó lo modifica $?

Utilidades de ficheros

basename fich

elimina del nombre la ruta, dejando ú nicamente el nombre

dirname fich

elimina el nombre del fichero, dejando ú nicamente la ruta

Apuntes Bash

35-40

sum, cksum, md5sum generadores de resumen (digest) de fichero

md5sum: 128bit Message Digest checkSUM.

Este programa imprime los 128bit en hexadecimal y el nombre del fichero al que se le ha realizado el resumen

shed

borrado seguro de fichero (imprime varias veces encima de forma aleatoria)

Comunicaciones

host nombreDNS

devuelve direcció n IP

host dirIP

devuelve el nombre DNS (resolució n inversa)

ipcalc

­h dirIP

devuelve el nombre DNS (resolució n inversa)

­m dirIP

m á scara de subred por defecto para dirIP

­n dirIP

red (aplicando la má scara por defecto)

nslookup

resolució n DNS

dig

resolució n DNS

 

­x

resolució n inversa

traceroute

traza de los saltos de red

ping

prueba de eco de conexió n a un equipo

whois

resolució n DNS

finger

usuarios conectados al sistema

Acceso Remoto

ssh, scp

terminal remoto seguro, copia de archivos segura

wget

descarga no interactiva

 

­c

continuar si existe una porci ó n del archivo (se interrumpió el proceso)

­r

descargas recursivas

­l

nivel de profundidad en la descarga (siguiendo enlaces)

ftp

transferencia de ficheros

telnet

terminal remoto (no seguro, mejor ssh)

Apuntes Bash

36-40

Varios

jot, seq [<inicio>] <fin> [<incremento>]

devuelve una secuencia (por defecto, inicio e incremento valen 1

 

­s sep

separa la secuencia con sep

run­parts

ejecuta los scripts de un directorio en orden alfab é tico

yes

imprime una secuencia ilimitada de cadenas (“yes” por defecto). Es ú til para programas interactivos donde se quiera aceptar todas las preguntas

tee <fich>

usado en pipe. Imprime stdin en fich ademá s de en stdout

dd

transferencias entre ficheros

 

if

input file

of

output file

bs

block size

count

n ú meros de bloques

ejemplo: dd if=~/ficheroImagen of=/dev/fd0 bs=1024 count=1440; sync

 

genera un floppy a partir de un fichero de imagen

sync

libera (flush) los buffers

Apuntes Bash

37-40

Comandos de Administración y Sistema

Usuarios y grupos

users

equivale a who ­q (lista los usuarios conectados)

groups

equivale a $GROUPS: grupos a los que pertenece el usuario actual

chown, chgrp

cambian el propietario o grupo de un fichero

useradd, userdel, usermod

crea, borra y modifica un usuario

groupmod

modifica un grupo

id

lista el uid, gid y euid del proceso actual

who

lista de usuarios conectados

w

lista de usuarios conectados y procesos asociados

logame

equivale a whoami (nombre usuario actual)

su <usuario>

cambia usuario efectivo (por defecto, root)

sudo <cmd>

ejecuta cmd como root (en /etc/sudoers se encuentran los usuarios con este privilegio)

passwd

cambia la contraseñ a de un usuario

ac

estad í sticas de tiempo de conexi ó n del usuario

Terminales

tty

muestra el fichero al que est á conectado stdin

stty

configurar terminal

ejemplo: detectar pulsació n sin necesidad de pulsar ENTER

 

old=$(stty ­g)

#guardar los valores actuales

stty ­icanon

#dehabilita el modo can ó nico (pasa a modo raw)

pulsacion=$(dd bs=1 count=1 2>/dev/null)

stty “$old”

setterm

atributos de terminal

­bold on/off

­cursor off

dmesg

lista de mensajes de arranque

Apuntes Bash

38-40

Información y estadísticas

uname

tipo de sistema (habitualmente “Linux”)

­a informaci ó n extendida sobre el sistema traza de las se ñ ales y llamadas al sistema de cmd

strace <cmd>

nmap <host>|<red> busca puertos abiertos en un host o una red

du

espacio usado por ficheros (por defecto, só lo directorios)

­a

incluye ficheros en la lista

­c

totaliza al final

df

informaci ó n de uso de sistemas de ficheros

netstat

informaci ó n sobre la red

­r

equivale a route. Tabla de enrutamiento

uptime

tiempo de conexió n del usuario actual

hostname

$HOSTNAME

hostid

identificador de 32bit de la má quina

Logs

logger

a ñ ade un mensaje a /var/log/messages

Procesos

ps

procesos con euid (usuario efectivo) igual al usuario actual

ax

todos los procesos

u

­b

formato orientado al usuario

pstree

todos los procesos en á rbol padre­hijos (todos penden de init)

top

lista de procesos por orden de carga de CPU, actualizada peri ó dicamente

no actualizaciones (para script)

nice nohup pidof <nomProg> fuser <fich>

valor de cortes ía de un proceso proceso contin ú a aunque el usuario que lo inici ó se desconecte pids de procesos asociados a un programa con nombre nomProg procesos que acceden a un fichero en un momento

Apuntes Bash

39-40

cron, crond

­k [­señ al]

enviarles señ al (por defecto, SIGKILL)

ejecuta tareas seg ú n la temporizaci ó n establecida en /etc/crontab

Control de procesos

runlevel

indica el nivel de ejecució n del sistema

0

parado

1

usuario ú nico

2­3

multiusuario