Scripts de bash

  • |
  • 02 January 2022
Post image

Scripts sencillos de bash

Hola mundo en bash

#!/bin/bash

# Primer script
echo "Hola Mundo!"

Variables

A='Hola mundo con bash!'
echo $A

# Salida:
Hola mundo con bash!

Control de flujo

- Bucles For

#!/bin/bash
for numero in {1..20..2};
do
	echo Este es el número: $numero
done

# Imprime:
Este es el número: 1
Este es el número: 3
Este es el número: 5
Este es el número: 7
Este es el número: 9
Este es el número: 11
Este es el número: 13
Este es el número: 15
Este es el número: 17
Este es el número: 19

- Condicionales (if)

nombre='Pepe'

if [[ nombre=='Pepe' ]]; # <- Atención a los espacios y a los corchetes
  echo "El nombre es Pepe"
then
elif [[ nombre=='Juan' ]]
    echo "El nombre es Juan"
else
    echo "No es ni Pepe ni Juan"
fi

# Imprime
El nombre es Pepe
– Condicionales con números
OperadorSignificado
-ltMenor que (<)
-gtMayor que (>)
-leMenor o igual que (<=)
-geMayor o igual que (>=)
-eqIgual (==)
-neDistinto de (!=)
#test.sh
#!/bin/bash
num1=$1  # la variable toma el primer valor que le pasamos al script
num2=$2  # la variable toma el segundo valor que le pasamos al script
if [[ $num1 -gt $num2 ]];
then
	echo $num1 es mayor que $num2
else
	echo $num2 es mayor que $num1
fi

Si ejecutamos el fichero, con los parámetros siguientes:

$ ./test.sh 2 3

#Imprime:
3 es mayor que 2
Condicionales con cadenas de texto
OperadorSignificado
=igual, las dos cadenas de texto son exactamente idénticas
!=no igual, las cadenas de texto no son exactamente idénticas
<es menor que (en orden alfabético ASCII)
>es mayor que (en orden alfabético ASCII)
-nla cadena no está vacía
-zla cadena está vacía

Wildcards (comodines): *

Condicionales con archivos
operadorDevuelve true si
-e namename existe
-f namename es un archivo normal (no es un directorio)
-s namename NO tiene tamaño cero
-d namename es un directorio
-r namename tiene permiso de lectura para el user que corre el script
-w namename tiene permiso de escritura para el user que corre el script
-x namename tiene permiso de ejecución para el user que corre el script

El siguiente script nos informa sobre el contenido de un directorio:

#!/bin/bash
for file in $(ls);
do
  if [[ -d $file ]];
  then
    echo directorio: $file
  else
    if [[ -x $file ]];
    then
      echo archivo ejecutable: $file
    else
      echo archivo no ejecutable: $file
    fi
  fi
done

Funciones

#!/bin/bash

echo "Script de una función"
a=7
b=67

function suma() {
  echo "La suma de $a+$b es: " $(($1+$2))
}
suma $a $b

Borrar un directorio de forma recursiva

$ rm -r Dir1 [Dir2 Dir3]

Fecha actual:

$ date             # sábado, 25 de abril de 2020, 11:44:03 CEST
$ date +"%a"       # sáb
$ date +"%A"       # sábado
$ date +"%b"       # abr
$ date +"%B"       # abril
$ date +"%d"       # 25
$ date +"%D"       # 04/25/20
$ date +"%F"       # 2020-04-25
$ date +"%H"       # 11 (horas)
$ date +"%M"       # 49 (minutos)
$ date +"%S"       # 23 (segundos)
$ date +"%T"       # 11:51:07
$ date +"%U"       # 16 (semana)
$ date +"%Z"       # CEST (TimeZone)
$ date +"%d-%m-%y" # 25-04-20
$ date +"%d-%m-%Y" # 25-04-2020

Crear un directorio y dentro un archivo

# El nombre de la carpeta y del archivo es el día actual, en formato yyyymmdd

#fecha actual
fecha=`date +"%Y%m%d"`

#crear directorio
mkdir $fecha

# poner el cursor en la carpeta creada
cd $fecha

#crear fichero
touch $fecha.txt

#Mostrar mensaje
echo "Se he creado el directorio $fecha y, dentro de este, el archivo $fecha.txt"

Comandos sobre el uso de disco

-du (Uso de disco)

-df (Sistema de archivos de disco)

  • Modificadores:
    • -h (human)
    • -s (muestra el total que ocupa)
$ df

# Muestra algo así:
Filesystem           1K-blocks      Used Available Use% Mounted on
C:/Program Files/Git 231422972 132131860  99291112  58% /
D:                    17342460  15307100   2035360  89% /d

$ df -h

# Muestra algo así:
Filesystem            Size  Used Avail Use% Mounted on
C:/Program Files/Git  221G  127G   95G  58% /
D:                     17G   15G  2,0G  89% /d



# uso del disco

$ du -sh
5,1G    .

Comandos para buscar texto

  • find: <find camino opciones>

    • -name “expresión”
    • -iname “expresión”
    • -type
      • f (file)
      • d (directory)
      • l (link)
    • -exec ( “{}” “;”)
#Ejemplo de find con exec

#Buscar los ficheros jpg
#Copiarlos a la ruta /Documents/test

$ find -iname "*.jpg" -exec cp '{}' c:/test ';'

Comandos para mostrar texto

  • cat -n : muestra el nº de línea
  • more
  • less
  • head
  • tail

Comandos para filtrar texto

  • cut: (selección vertical) -c : carácter -d : delimitador -f : (field) columna a mostrar
# Muestra el primer carácter de cada línea del fichero
cut -c1 fichero.txt

# Muestra los caracteres 1 a 10 de cada línea del fichero
cut -c1-10 fichero.txt

#Distintos intervalos
cut -c1-10,20-30 ficheros.txt
# -d indica el separador que se va a usar
# -f indica la columna que se va a extraer
cut -d";" -f1 nombres.csv
  • grep: Muestra solo las líneas que cumplen con un patrón. Se pueden usar palabras o expresiones regulares.

    -v : Muestra las que NO coinciden con el patrón -l : Indica el nombre del fichero donde ha encontrado la coincidencia -w : El patrón tiene que ser una palabra independiente -n : Indica el nº de línea -i : no distingue entre mayúsculas y minúsculas -c : nº de líneas que cumplen el patrón -r : búsqueda recursiva

 # Búsqueda recursiva desde el directorio actual; muestra el nombre del fichero que cumple el patrón

grep -l -r markdown

# Elimina las líneas en blanco:
 $ grep -v '^$'

Truco

Cuando recorremos un directorio con ficheros cuyo nombre puede que contenga espacios en blanco (algo muy habitual si descargamos vídeos con youtube-dl), no funciona el típico:

#!/bin/bash

directorio="midirectorio"

for i in $(ls $directorio)
do
    echo $i
done

Ni siquiera serviría entrecomillar el $i, ya que no le llegaría el nombre del fichero al recortarse en el for.

La solución es cambiar antes de hacer el for el separador de campo con:

IFS=’ '

Quedando el script así:

#!/bin/bash

directorio="midirectorio"
IFS='
'

for i in $(ls $directorio)
do
    echo $i
done

También te puede interesar: