Skip to content

Latest commit

 

History

History
483 lines (366 loc) · 13 KB

File metadata and controls

483 lines (366 loc) · 13 KB

shieldsIO shieldsIO shieldsIO

WideImg

Máster en Programación FullStack con JavaScript y Node.js

JS, Node.js, Frontend, Backend, Firebase, Express, Patrones, HTML5_APIs, Asincronía, Websockets, Testing

Clase 55

IMG

UNIX Shell

Una Shell de Unix o también shell, es el término usado en informática para referirse a un intérprete de comandos, el cual consiste en la interfaz de usuario tradicional de los sistemas operativos basados en Unix y similares como GNU/Linux.

Mediante las instrucciones que aporta el intérprete, el usuario puede comunicarse con el núcleo y por extensión, ejecutar dichas órdenes, así como herramientas que le permiten controlar el funcionamiento de la computadora.

Los comandos que aportan los intérpretes, pueden usarse a modo de guion si se escriben en ficheros ejecutables denominados shell-scripts, de este modo, cuando el usuario necesita hacer uso de varios comandos o combinados de comandos con herramientas, escribe en un fichero de texto marcado como ejecutable, las operaciones que posteriormente, línea por línea, el intérprete traducirá al núcleo para que las realice. Sin ser un shell estrictamente un lenguaje de programación, al proceso de crear scripts de shell se le denomina programación shell o en inglés, shell programming o shell scripting. Wikipedia

Terminales más comunes

  • bash - GNU Project's shell (Bourne Again SHell)
  • elvish - Friendly, expressive shell features like anonymous functions and data structures
  • fish - Smart and user-friendly command line shell
  • shenv - Simple shell version management
  • xiki - Makes the shell console more friendly and powerful
  • xonsh - Python-ish, BASHwards-looking shell language and command prompt
  • zsh - Powerful shell with scripting language

Terminales Awesomicas

Recursos

Lidiando con el sistema

Shell Scripting

Comentarios

# En una sola línea...
: '
Comentario
en multiples
líneas...
'

Ejemplo simple

#!/usr/bin/env bash

nombre="Yo mismo"
echo "Hola $nombre!"

Manejo de Variables

nombre="Yo mismo"
echo $nombre
echo "$nombre"
echo "${nombre}!"

Diferencia entre tipos de cadenas de texto

  • usando '$nombre' es literal.
  • usando "$nombre"
nombre="Yo mismo"
echo "Hola $nombre"  #=> Hola Yo mismo
echo 'Hola $nombre'  #=> Hola $nombre

Ejecución condicional

echo "Primero estos..." && "Si todo va bien... saldrá esto después"
git commit || echo "Esto pasa cuando falla lo anterior"

Funciones

quien_eres() {
  echo "Yo mismo"
}

echo "Tu eres... $(quien_eres)"

Ejecución de Terminal

echo "Estoy en $(pwd)"
echo "Estoy en `pwd`"
# Same

Expansión de abrazadera (Brace expansion)

echo {A,B}.js   # A.js B.js
echo {1..5}	    # 1 2 3 4 5

Expansión de parámetros

Lo básico

nombre="Fictizia"
echo ${nombre}
echo ${nombre/i/1}       #=> F1ctizia
echo ${nombre:0:5}       #=> Ficti
echo ${nombre::2}        #=> Fi
length=2
echo ${nombre:0:length}  #=> Fi

STR="/ruta/carpeta/fichero.sh"
echo ${STR%.sh}    # /ruta/carpeta/fichero
echo ${STR%.sh}.hacked  # /ruta/carpeta/fichero.hacked
echo ${STR##*.}     # sh (extension)
echo ${STR##*/}     # fichero.sh (script con extension)
echo ${STR#*/}      # ruta/carpeta/fichero.sh
echo ${STR##*/}     # fichero.sh
echo ${STR/carpeta/folder} # /ruta/folder/fichero.sh

Valores por defecto

${DATO:-val}	    # $DATO, o val si no existe
${DATO:=val}	    # Iguala $DATO a val si no existe
${DATO:+val}	    # val si $DATO existe
${DATO:?message}	# Muestra mensaje de error y sale si $DATO NO EXISTE
                    # Muestra "mensaje" como opcional)
					
Ejemplo:

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

Bucles

For (básico)

for i in /etc/rc.*; do
  echo $i
done

Rangos

# Continuo
for i in {1..5}; do
    echo "Welcome $i"
done

Rangos con pasos

for i in {5..50..5}; do
    echo "Welcome $i"
done

While

while true; do
  #···
done

Por cada linea de un fichero

cat file.txt | while read line; do
  echo $line
done

Funciones

Definición de funciones

miFuncion() {
    echo "Hola $1"
}

# Otra forma
function miFuncion() {
    echo "Hola $1"
}

miFuncion "Amigo!" #Hola Amigo!

Retorno de valores

miFuncion() {
    local resul='Dato...'
    echo $resul
}
resultado=$(miFuncion) 
echo ${resultado} #Dato...

Lanzamiento de Errores

miFuncion() {
  echo 1
}
if miFuncion; then
  echo "Éxito"
else
  echo "Fallo"
fi

Argumentos

$#	# Numero de Argumentos
$*	# Todos los argumentos
$@	# Todos los argumentos, Empezando por el primero
$1	# Primer Argumento

Condicionales

Operadores

[ -z STRING ]	        # Cadena vacia
[ -n STRING ]	        # Cadena NO vacia
[ NUM -eq NUM ]	        # igual
[ NUM -ne NUM ]	        # desigual
[ NUM -lt NUM ]	        # Menor que
[ NUM -le NUM ]	        # Menor o igual que
[ NUM -gt NUM ]	        # Mayor que
[ NUM -ge NUM ]	        # Mayor o igual que
[[ STRING =~ STRING ]]	# Expresión regular
[ ! EXPR ]	            # Not
[ X ] && [ Y ]	        # And
[ X ] || [ Y ]	        # Or

Operadores de ficheros

[ -e ARCHIVO ]	            # Existe
[ -r ARCHIVO ]	            # Leible
[ -h ARCHIVO ]	            # Symlink (Vinculos simbolicos)
[ -d ARCHIVO ]	            # Directorio
[ -w ARCHIVO ]	            # Escribible
[ -s ARCHIVO ]	            # La logitud es mayor de 0 bytes
[ -f ARCHIVO ]	            # Fichro
[ -x ARCHIVO ]	            # Ejecutable
[ ARCHIVO1 -nt ARCHIVO2 ]	    # ARCHIVO1 es más reciente que ARCHIVO2
[ ARCHIVO1 -ot ARCHIVO2 ]	    # ARCHIVO2 es más reciente que ARCHIVO1
[ ARCHIVO1 -ef ARCHIVO2 ]	    # Son lo mismo ARCHIVO1 y ARCHIVO2

Ejemplo cadenas de texto

nombre="Yo mismo!"

if [ -z "$nombre" ]; then
  echo '$nombre esta vacio'
elif [ -n "$nombre" ]; then
  echo '$nombre NO esta vacio'
fi

Ejemplo números

numero=12
if [ ${numero} -ge 0 ]; then
   echo Número positivo
else
   echo Número negativo
fi

Ejemplo Combinatorios

Name=Steve
Age=15
if [ "$Name" == "Steve" ] && [ "$Age" -eq 15 ]; then     echo "This will run if $Name is Steve AND $Age is 15."; fi
This will run if Steve is Steve AND 15 is 15.

Ejemplo Ficheros

if [ -e "fichero.txt" ]; then
  echo "fichero.txt existe"
fi

Arrays

Definición

frutas=('Manzana' 'Platano' 'Mnadarina');

lista_nueva[0]="Cohete"
lista_nueva[1]="Astronauta"
lista_nueva[2]="Lanzadera"

Trabajando con Arrays

frutas=('Manzana' 'Platano' 'Mandarina');

echo Elemento[0]: ${frutas[0]}              # Elemento[0]: Manzana
echo Frutas: ${frutas[@]}                   # Frutas: Manzana Platano Mandarina
echo Longitud: ${#frutas[@]}                # Longitud: 3
echo Nº letras de Manzana: ${#frutas}       # Nº letras de Manzana: 7
echo Nº letras de Mandarina: ${#frutas[2]}  # Nº letras de Mandarina: 0

Iteración

frutas=('Manzana' 'Platano' 'Mandarina');

for i in "${frutas[@]}"; do
  echo Elemento: $i
done

Operaciones

Operaciones
Fruits=('Manzana' 'Platano' 'Mandarina');
Fruits=("${Fruits[@]}" "Sandía")        # Push
Fruits=( ${Fruits[@]/Man*/} )           # Eliminar un elemento usando REGEX
unset Fruits[1]                         # Eliminar un elemento en concreto
lines=(`cat "fichero.txt"`)             # Read from file

echo ${Fruits[0]}           # Element #0
echo ${Fruits[@]}           # All elements, space-separated
echo ${#Fruits[@]}          # Number of elements
echo ${#Fruits}             # String length of the 1st element
echo ${#Fruits[3]}          # String length of the Nth element
echo ${Fruits[@]:0:2}       # Range (from position 0, length 2)

Otras cosas importantes

Operaciones aritmeticas

$((a + 200))      # Añade 200 a $a
$((RANDOM%=200))  # Número al azar entre 0..200

Inspecionando comandos

command -V cd
#=> cd is a shell builtin

Input del usuario

echo -n "Proceed? [y/n]: "
read respuesta
echo $respuesta

Terminales secundarios

(cd somedir; echo "I'm now in $PWD")
# pwd # still in first directory

Redirección

python hello.py > output.txt   # stdout to (file)
python hello.py >> output.txt  # stdout to (file), append
python hello.py 2> error.log   # stderr to (file)
python hello.py 2>&1           # stderr to stdout
python hello.py 2>/dev/null    # stderr to (null)
python hello.py &>/dev/null    # stdout and stderr to (null)
python hello.py < foo.txt

CRON, Programación de tareas

Las Claves

  • Nos permite grabar tareas ciclicas (ejecutar scripts) en la maquina
  • El tiempo minimo es de un minuto, una repetición al minuto
  • Es altamente configurable
  • Cron es un demonio dle sistema que supervisa los jobs
  • jobs son las tareas que hemos programado en el sistema
  • Crontab es un fichero de texto plano que guarda la información de los jobs
  • Necesitas generar un script con shebang y permisos de ejecucción

Esquema de tiempo

img

Agregar tareas

  • 00 19 * * * user_x /carpeta/del/script/ficherito.sh
  • 00 00 1 * * root /carpeta/del/script/algo.js

Recursos

Ejercicios

1 - Katas de Shell en CMD Challenge. ¯\_(ツ)_/¯