shell – conceptos básicos.
Contraseñas en UNIX.
# No considera el último carácter tecleado.
Ejemplo. User##r3 User3
@ No considera lo escrito en la línea hasta que aparece @:
Ejemplo: sdadsd@user3 user3
# Añade comentarios, se extiende hasta el final de la línea.
$? Nos da el resultado de la última operación realizada.
- Si devuelve 0 la operación se ha ejecutado correctamente.
- Si devuelve distinto de 0 la operación ha fallado.
- Son muy útiles cuando utilizamos test.
? Delante de una variable nos devuelve 1 si existe y 0 si no está definida.
$$ Sirve para referirnos al numero de proceso del Shell.
$< Nos permite leer una línea de la entrada estándar, puede ser utilizada
para leer datos del teclado.
Permisos a la hora de ejecutar un Shell script:
Para poder ejecutar un archivo de comandos, este tiene que tener al menos
permisos de lectura y ejecución.
; Nos sirve para escribir comandos en la misma línea, todos ellos irán
separados por el “;” , la ejecución de estos comandos es consecutiva.
\ Si un comando no cabe en una línea, utilizaremos “\”, de esta forma
especificaremos que la línea siguiente pertenece a este comando, lo
situaremos al final de la línea que queda cortada.
True Este comando devuelve siempre 0, ya que la ejecución correcta de todo
comando devuelve un 0.
Prompt> true
Prompt> $?
Prompt> 0
False Este comando devuelve siempre distinto de 0, es decir la ejecución ha sido
incorrecta.
Prompt> false
Prompt> $?
Prompt> 1
exit Termina inmediatamente un script y vuelve a la shell original.
| Operador lógico OR, diciembre|enero, se interpreta diciembre OR enero
read Solicita que el usuario introduzca algo por teclado hasta que se pulse
enter.
echo –n
Permite que no se produzca el salto de línea.
Parámetros:
$# Cantidad de parámetros pasados.
$* Lista de parámetros pasados al programa
$1 .. $9 Máximo numero de parámetros pasados a un Shell.
$0 Nombre del programa Shell ejecutado.
$@ N strings, se suele usar con for.
Nos muestra la lista de parámetros pasados al shell.
for var in $*
do
echo $var
done
2>nom_fichero
Redirección de la salida estándar de ERRORES al fichero nom_fichero, en
lugar de hacerlo por pantalla.
Set Sirve para definir variables.
Ejemplos.
set numero=1
set lista=( rojo verde azul)
set palabra = “Esto es una variable”
& Operador de background:
Sirve para ejecutar un comando en background, se usa siempre después del
comando. Esto lo que hace es devolvernos el control inmediatamente en vez
de esperar a que se ejecute el comando.
Ejemplo.
comando1 & comando2 &
Se ejecutará comando1, después comando2 y luego nos dará el control.
Caracteres especiales en Shell Script.
- Dentro de un string normal y corriente no se interpretan estos
caracteres.
o | & ; ( ) < > $ !
- Para que sean interpretados deberemos de usar el \ delante de ellos, en
el string.
- Si ponemos ‘string’ todo el string se interpretara literalmente.
- Si ponemos “string” se preserva el significado de los siguientes
comandos:
o $ ‘ \$ \’ \” \\ \retorno_carro $@ $*
Variables:
- Definición de una variable.
o Nom_var=valor # Sin espacios.
- El valor por defecto es “” que es vacío.
- Si queremos ver el valor de una variable:
o $nom_var
o ${nom_var}
- Si queremos saber la longitud de esa variable.
o ${#nom_var}
Ejecución de comandos:
nom_var tomará la salida de la ejecución del comando
nom_var=$(comando) o nom_var=`comando`
Ejemplo.
fecha=$(date) o fecha=`date`
echo fecha
lun ene 19 17:00:00 CET 2009
Más comandos:
cat Concatena ficheros y los imprime por la salida estandar.
cd Cambia de directorio.
cut –d”separador” –f nº_col:
Corta columnas.
cut –d”:“ –f2 [Link]
# Corta la segunda columna buscando el espaciador espacio en blanco.
date informa de la fecha y hora del sistema.
dd convierte y copia un fichero.
who informa acerca de quien esta en el sistema.
Estructuras básicas en Shell:
- Estructura alternativa:
o Si
o Caso De
- Estructura repetitiva:
o Mientras Que.
o Para.
Si (lo que va en negrita es siempre así, en minúsculas y en ese orden):
if expresión
then
comandos
elif expresión
then
comandos
else
comandos
fi
Caso de:
case $cadena in Valor de la expresión para ver con los patrones
patron 1)
comandos;;
patron 2)
comandos;; Obligatorio los dos puntos y coma “;;”
*) Cuando no se cumple ningún patrón.
comandos;;
esac
Para:
for variable in lista
do
comandos
done
Mientras Que (Se ejecuta 0 o más veces):
Mientras la evaluación de la expresión entre paréntesis sea verdadera (<> 0), se
ejecutarán los comandos comprendidos entre while y done.
while condicion
do
comandos
done
Hasta Que (Se ejecuta 1 o más veces):
until condicion
do
Comandos
done
foreach
foreach var (lista de palabras)
comandos
end
foreach f ( $argv[*] ) # Valor de todos los argumentos pasados ( $* )
set name=$f.M # Variable name que guarda el nombre del argumento y le
añade la extensión M.
cat $f | tr ‘a-z’ ‘A-Z’ > $name
# Transforma minúsculas por mayúsculas y lo envía al
fichero name que ya tiene la extensión M.
end
switch
switch ( string )
case label1: # Si string coincide con label1, se ejecuta comandos.
comandos
case label2: # Si string coincide con label2, se ejecuta comandos.
comandos
...
breaksw # Si encuentra esto, sale del switch, después de endsw
...
defautl: # Si string no coincide con label, se ejecuta default.
comandos
...
breaksw
endsw # Final de switch.
Select
Select nom_var [in lista]
Do
codigo
done
Genera un menú para cada objeto de la lista.
Pregunta al usuario por un numero, (prompt=PS3)
Guarda la opción seleccionada en REPLY(numero seleccionado)
Repite el proceso de forma continua, hay que salir usando break.
Comandos que se usan dentro de un Shell Script
expr Este comando recibe números y operadores aritméticos como
argumentos, efectúa los cálculos indicados y devuelve el resultado.
Solo opera con números enteros y realiza la suma, resta,
multiplicación, división entera y resto de la división entera (“%”).
Los símbolos + y – los podemos utilizar normalmente, pero la
multiplicación y la división la tendremos que poner de la siguiente
forma \* y \/.
Si queremos utilizar paréntesis, también irán \( y \).
También puede realizar operaciones lógicas de comparación aceptando
=, !=, <, >, >=, <=, todos ellos los usaremos con \=, \!=, \<, \>, \
>=, \<=.
Cada argumento debe estar separado por blancos.
MUY IMPORTANTE: expr devuelve 1 si es cierto y 0 si es falso.
Ejemplos.
cuenta=`expr $cuenta + 1` # Incrementa cuenta en 1.
echo `expr 6 \< 10` # Es 6 < 10, devuelve 1, es cierto.
echo `expr 6 \> 10` # Es 6 > 10, devuelve 0, es falso.
i=1
i=$(expr $i + 1) o i=`expr $i + 1`
i=$((i+1)
argv Contiene una copia de los argumentos de la línea de comandos. Si
queremos hacer referencia al argumento 2 de la línea, usaremos:
$argv[2] o $2
test Sirve para testear el resultado de un comando, devolverá solo
verdadero o falso, no hace otras operaciones.
Su convención es contraria a expr, aquí si devuelve 0 es que es
cierto o se ha ejecutado correctamente, si es distinto de 0 es que
ha ido mal.
Este comando puede ser utilizado de dos formas y se suele combinar
con la estructura IF:
test expresión o [ expresión ]
Ante una cadena vacía el comando devuelve falso o distinto de 0 y
ante una cadena no vacía devuelve verdadero o 0.
MUY IMPORTANTE: Es conveniente que los nombres de las variables
vayan encerrados entre comillas dobles al igual que los valores
comparativos.
Opciones del comando test:
if [ -f archivo ] Existe y es del tipo fichero
if [ -r archivo ] Si se puede leer, es cierto
if [ -w archivo ] Si se puede escribir, es cierto
if [ -x archivo ] Si se puede ejecutar, es cierto
if [ -s archivo ] Existe y tiene un tamaño mayor de 0
if [ -d archivo ] Existe y es del tipo directorio
if [ -b archivo ] Si es fichero especial de bloques
if [ -c archivo ] Si es fichero especial de caracteres
if [ -h archivo ] Si es enlace simbólico
if [ -n archivo ] No es nulo
if [ -O archivo ] Es propietario del archivo
if [ -G archivo ] Es un grupo con acceso
if [ -e archivo ] Existe
Cadenas de caracteres
if [ -n cadena ] Cierto si la cadena es distinto de 0
if [ cad1 = cad2 ] Cierto si ambas cadenas son iguales
if [ cad1 ¡= cad2 ] Cierto si ambas cadenas son distintas
if [ cad1 ] Cierto si la cadena no es nula
Comparación de enteros
if [ $var –eq 1 ] Cierto si es igual a 1
if [ $var –ne 1 ] Cierto si es distinto de 1
if [ $var –lt 1 ] Cierto si es menor que 1
if [ $var –le 1 ] Cierto si es menor o igual a 1
if [ $var –gt 1 ] Cierto si es mayor que 1
if [ $var –ge 1 ] Cierto si es mayor o igual que 1
Operadores lógicos
if [ ¡ expresión ] Devuelve 1 si es verdadero, en caso contrario
0
if [ exp1 –a exp2 ] Devuelve 0 si ambas expresiones son ciertas
if [ exp1 –o exp2 ] Devuelve 0 tanto si solo una es cierta como
las dos
Ejemplos.
if test “cadena de caracteres” if [ cadena ]
then
echo cierto
else
echo falso
fi
if test “” if [ ]
then
echo falso
else
echo cierto
fi
if test –f Pepito if [ -f Pepito ]
then
echo ‘El fichero existe’
else
echo ‘El fichero no existe’
fi
Si existe el fichero Pepito y es del tipo fichero, devuelve
verdadero, en caso contrario devuelve falso.
Si fich1 y fich2 existen y son de lectura, devuelve cierto
if [ -r $fich1 –a –r $fich2 ]
then
echo ambos se pueden leer
fi
Preguntar sobre la existencia de un fichero, si no lo está, lo crea.
if [ -f $fich ]
then
echo “Ya existe”
else
touch $fich
echo “Lo acabo de crear”
fi
Más programación Shell.
echo “ Diga si o no “
read var
if [ $var == “si” ] || [ $var == “SI” ]
then
echo “Ha dicho si”
else
echo “No ha dicho si”
fi
if [ -d correo ]
then
echo “El archivo correo existe y es un directorio”
fi
if [ -e correo ] && [ -d correo ]
then
echo “Existe y es directorio”
fi
if [ -e correo ] && [ ! -d correo ]
then
echo “El fichero correo existe y NO es directorio”
fi
nota=”9:10:0”
IFS=: #Separador, por defecto es el blanco
for nota in $nota
do
echo “La nota es $nota”
done
case “$#” in
0 )
echo “Ningún argumento” ;;
1 )
echo “Algún argumento” ;;
* )
echo “Valor erróneo” ;;
esac
PS3=”Que quiere comer” # Guarda el contenido de la selección
IFS=: # Delimitador de la variable
comidas=”paella:tortilla:salir”
select eleccion in $comidas
do
case $eleccion in
paella )
echo “Paella” ;;
tortilla )
echo “Tortilla” ;;
salir )
break ;;
* )
echo “Comida no disponible, elija otra”
esac
done
LINEAS=`cat f* | wc –l`
echo $LINEAS
# muestra el numero de lineas de los archivos que comienzan por f
echo cat f* | wc –l
# Solo contaria una linea
echo `cat f* | wc –l`
#Contaria todas las lineas
# Ejemplo del funcionamiento del comando shift en Shell
# Mueve la lista de parametros hacia la izquierda, por lo
# tanto en cada pasada solo muestra el valor del parámetro 1
while test $# != 0
do
echo "Argumento $1" # Mejor poner comillas simples
echo 'Argumen $1' # No interpreta el caracter especial
echo “Argumento \$1” # No interpreta el caracter especial después de \
shift
done
programa uno dos tres
uno
dos
tres
# Redirección a fichero de todos los arhivos del directorio.
for i in `ls`
do
if [ -f $i ]
then
cat $i >> [Link]
fi
done
cat /etc/passwd | cut -d: -f5 | sort -t: +5
paso 1) Hace un cat de /etc/passwd
paso 2) selecciona la 5 columna utilizando el delimitador :
paso 3) ordena por ese campo, el 5
El comando correcto sería.
cat /etc/passwd | cut -d: -f5 | sort
# Da el mes por parametro y ordena los ficheros por mes
echo "Introduzca el mes por parametro"
read mes
case $mes in
1 ) mes=ene;;
2 ) mes=feb;;
3 ) mes=mar;;
4 ) mes=apr;;
5 ) mes=may;;
6 ) mes=jun;;
7 ) mes=jul;;
8 ) mes=aug;;
9 ) mes=sep;;
10 ) mes=oct;;
11 ) mes=nov;;
12 ) mes=dec;;
* ) mes=mierda;;
esac
if [ $mes = mierda ]
then
echo " Que puto mes has puesto"
else
echo "El valor de la variable mes es "$mes
ls -latr | grep $mes
fi