Guía de Scripts Bash en Linux
Guía de Scripts Bash en Linux
Ficheros bash
Para que Linux identifique el fichero a ejecutar como un script hay que
realizar varios pasos:
#!/bin/bash
1. Permisos de ejecución.
El fichero a ejecutar debe tener permisos de ejecución, una vez creado el script
bash hay que darle los permisos necesarios:
chmod +x nombre_del_script
1. Nombre y extension.
El fichero a crear, puede tener cualquier extensión o incluso no tenerla, ya que Linux sabe que
debe realizar al leer la primera línea del fichero (paso 1).
Los scripts Bash y sus comandos se ejecutan de forma secuencial de la primera a la última
linea, excepto las funciones como veremos más adelante.
" En mi caso suelo usar vi/vim, por ser uno de los que siempre están
instalados
por defecto en todos los equipos con GNU/Linux.
vim [Link]
#!/bin/bash
echo "Hola. Soy tu primer script Bash"
NOTA 1: echo es un comando Linux que nos muestra por pantalla un texto o
el contenido/valor de una o varias variables.
Salimos guardando, para ello en vim pulsamos ESC y luego escribimos :wq
./[Link]
Parámetros
Un script Bash puede recibir parámetros y estos pueden ser procesados dentro de él.
$# Nº de parametros recibidos
shift Comando que desplaza los parametros recibidos (excepto $0 ) a una posición
anterior.\newline
Ejemplo: Hemos recibido dos parámetros, $1 con el valor UNO y el segundo parámetro $2 con
el valor DOS .\newline
Si ejecutamos shift el 2º parametro se desplaza y ocupa la posicion del 1º, el valor de este
desaparece.
Para explicarlo con detalle, vamos a crear nuestro propio script usando nuestros propios
parámetros.
Procesaremos los parámetros recibidos que podremos recibir en cualquier orden y haremos
uso de shift ,
para que independientemente del orden de los parámetros, los pueda procesar. \newline
Script: [Link]
#!/bin/bash
# USO: ./[Link] --nombre NOMBRE --apellido APELLIDO
while [[ $# > 0 ]] # Recorrer todos los parametros recibidos
do
case "$1" in
-n | --nombre )
shift # Encontre "-n" o "--nombre" Con shift salto al siguiente parametro que es el valo
nombre="$1" # guardo en la variable nombre el valor.
shift # Salto al siguiente parametro
;;
-a | --apellido )
shift
apellido="$1"
shift
;;
* )
# Algo no es lo que esperaba..
shift # Ignoro y salto al siguiente parametro
;;
esac
done
Vamos ahora a ejecutarlo indicando los parametros y vemos que funciona correctamente:
Variables
En un script Bash se pueden usar variables para almacenar valores o
el resultado de la ejecución de comandos.
Texto
Números
Arrays
Variables Globales/Locales
Las variables pueden ser globales a nivel de todo el script o locales cuando están dentro de una
función.
Declaración de variables
Para declarar una variable, simplemente hay que escribir el nombre de la variable,
seguida de un igual y el valor que se le quiera asignar.
" Observa que se pueden usar comillas simples o dobles para almacenar una
cadena de texto.
nombre=Luis
CALLE="Calle Larga"
Despacho=401
Los dos formatos soportados para ejecutar un comando y almacenarlo en una variable son:
VAR=$(comando)
VAR=`comando`
Salida=$(comando 2>&1)
Almacenamos en $VarA los valores de otra variable $OTRA , en $VarB concatenamos Variables y
Texto.
VarA=$OTRA
VarB="$V1 texto1 $V2 texto2 ..."
OPCION=$1
SORTEMARAP="$3 $2 $1"
VarA="En un lugar"
VarB='de la Mancha'
VarC="de cuyo nombre no quiero"
VarD=acordarme
TEXTO="$VarA $VarB $VarC $VarD"
echo $TEXTO
En un lugar de la Mancha de cuyo nombre no quiero acordame
" Nota: Se pueden concatenar cadenas de texto tanto con comillas simples
como dobles o sin ellas.
Mucho cuidado al usar las comillas simples y dobles, o es lo mismo usar " que ' , ya que las
comillas simples impiden que se procese dentro de ellas el valor de las variables.
NONO='$3 $2 $1'
En este caso se crea la variable y se guarda '$3 $2 $1' . NO se guarda el valor de los parámetros
Arrays
Bash permite usar arrays, se pueden definir de varias formas:
declare ARRAY[n]
typeset ARRAY[n]
ARRAY=(a b c ... x y z)
declare -a Colores
En este caso se crea una variable $Colores que es un array sin tamaño definido.
Sintaxis:
ARRAY[n]=valor
Al igual que en todos los lenguajes la numeración si un array tiene n elementos, sus índices van
del 0 a n-1.
Para los Arrays existe una sintaxis especial, para poder usarlos debemos usar ${} :
Ejemplo 4: Ver los índices y elementos reales del array. Debemos usar ${!ARRAY[@]}
Frutas[5]="melocoton"
echo "Nº Elementos: ${#Frutas[@]}"
Nº Elementos: 4
echo "Indices en uso: ${!Frutas[@]}"
Indices en uso: 0 1 2 5
Concatenar Arrays
Podemos unir varios arrays, simplemente debemos usar los paréntesis para definir
la variable que los almacena como array e incluir una coma , como elemento de
concatenación:
NIX=("${Unix[@]}", "${Linux[@]}")
echo ${NIX[@]}
SCO, HP-UX, IRIX, XENIX, Debian, Suse, RedHat
Estructuras de Control
IF
IF IF - ELSE IF - ELIF
comandos comandos
fi else
comandos
fi
FOR
FOR FOR (Estilo C)
do do
done done
WHILE y UNTIL
WHILE UNTIL
do do
comandos comandos
done done
CASE
case $VARIABLE in
valor1)
comandos_opcion-1
;;
valor2 | valor3 | valor4)
comandos_opcion-2-3-4
;;
valorN)
comandos_opcion-N
;;
*)
comandos_opcion-por-defecto
;;
esac
SELECT
#!/bin/bash
# Menu Sencillo
SALIR DE BUCLES
continue No finaliza los procesos/comandos que faltan del bucle y comienza la siguiente
iteración
Operadores y Operaciones
Operadores Lógicos
AND/Y: && ó -a
OR/O: || ó -o
NOT/NEGACION: ! \newline
Si queremos combinar condiciones los operadores lógicos van fuera de los corchetes:
if [ $a > $b ] || [ $j < $k ]
Operadores Aritméticos
+ Sumar
- Restar
* Multiplicar
/ Dividir
** Elevar
++ Incrementar
-- Decrementar
$((operacion))
$[operacion]
Ejemplos de operaciones:
Operadores de Cadenas
Se pueden realizar operaciones con las cadenas de texto directamente:
Comparadores
Comparadores Alfanuméricos/Texto
== Igual
!= Distinto
-z Es nulo
Comparadores Numéricos
-nt El fichero es más reciente (new) que el otro (F1 -nt F2)
-ot El fichero es más antiguo (old) que el otro (F1 -ot F2)
/dev/full Dispositivo que está siempre lleno. Usado para test de disco lleno. Al leer de él
se comporta como /dev/zero
Redirectores
stdin asociado a 0
stdout asociado a 1
stderr asociado a 2
Todos estos descriptores se pueden usar para capturar los datos que pasan por ellos y
reenviarlos a variables o ficheros.
Separación de la salida
Podemos separar las diferentes salidas ( stdout y stderr ), usando sus descriptores.
1. Enviar el resultado (stdout/1) del comando a un fichero y dejar que los mensajes de error
salgan por pantalla:
1. Enviar el resultado (stdout/1) a un fichero e ignorar los errores (stderr/2), evitando que
salgan incluso por pantalla, redirigiendolos al dispositivo /dev/null :
> Fich Redirigir las dos salidas stdout y stderr hacia fich (fichero/dispositivo),
>> Fich Redirigir las dos salidas stdout y stderr hacia fich (fichero/dispositivo),
se añade la salida del comando al final del fichero Fich y si no existe se crea.
1> Fich1 2> Fich2 Redirige salida estandar stdout hacia Fich1, la salida de errores (stderr) hacia Fich2,
> Fich 2>&1 Redirigir salida stdout hacia fich y la de errores stderr a donde apunta stdout.
< Fich Lee el contenido del fichero Fich y lo envia al comando que le precede.
Tuberias o Pipes
Un ejemplo sencillo:
Tenemos una carpeta con varios ficheros y queremos su lista en orden alfabético ascendente y
descendente:
$ ls -l
total 24
-rw-r--r-- 1 luisgulo luisgulo 1 ene 21 00:30 aaa
-rw-r--r-- 1 luisgulo luisgulo 4 ene 21 00:30 ddd
-rw-r--r-- 1 luisgulo luisgulo 2 ene 21 00:30 bbb
-rw-r--r-- 1 luisgulo luisgulo 3 ene 21 00:30 ccc
-rw-r--r-- 1 luisgulo luisgulo 6 ene 21 00:30 fff
-rw-r--r-- 1 luisgulo luisgulo 4 ene 21 00:30 ddd
-rw-r--r-- 1 luisgulo luisgulo 5 ene 21 00:30 eee
Usaremos l comando sort que nos permite ordenar de modo normal o en modo
inverso/reverso sort -r un fichero o cualquier dato que reciba.
# Orden normal
ls -1 | sort
aaa
bbb
ccc
ddd
eee
fff
# orden inverso/reverso
ls -1 | sort -r
fff
eee
ddd
ccc
bbb
aaa
RESOLUCION=$(xrandr | grep current | awk -F "," '{print $2}' | awk '{print $2"x"$4}')
echo $RESOLUCION
2646x1024
Funciones
Las funciones nos permite agrupar varias acciones o grupo de comandos repetitivos dentro de
un script, para usarlas cuando las necesitemos.
Definir Funciones
function NombreFuncion {
comandos
...
}
NombreFuncion () {
comandos
...
}
En ambos formatos, los comandos a ejecutar en la función van entre llaves de inicio y cierre:
{ }
Ámbito Global: Una variable definida en la parte principal del script (fuera de cualquier
función) es accesible (se puede leer y escribir) desde dentro de cualquier función.
Ámbito Local: Una variable definida con el atributo local es unicamente accesible desde
dentro de esa función.
Abre tu editor de texto (vi/vim, nano, joe) y copia y pega el siguiente contenido del script.
El fichero lo vamos a grabar con el nombre: que_pasa.sh
#!/bin/bash
function AlgoPasa {
local UNO="Texto uno"
DOS="Texto dos"
echo "DENTRO DE LA FUNCION -> Variable UNO = $UNO y Variable DOS = $DOS"
}
# Llamamos a la función
AlgoPasa
./que_pasa.sh
n: Donde n es cualquier valor distinto de cero (0). Indica que se ha producido algún error.
Para ello, la última línea de código que se ejecute debe emitir ese código.
Ejemplo:
#!/bin/bash
RUTA="$1" # Recibimos como parámetro una ruta
ls -l $RUTA 2>/dev/null
CodError=$? # Capturamos en variable $CodError codigo salida del comando anterior
if [ $CodError -eq 0 ] ; then
echo "Todo correcto"
else
echo "Atencion: Se produjo algun error"
fi
exit $CodError
En lugar de utilizar exit las funciones tienen que usar la instrucción return num para notificar el
código de salida/error que produzcan.
" NOTA:
su ejecución.
return únicamente permite devolver un número como resultado de
Si queremos que una función nos devuelva otro valor que no sea un número, por ejemplo una
cadena de texto, un array o cualquier otra cosa, deberemo usar una varible global en la que
almacenaremos el valor deseado.
#!/bin/bash
function Une {
local palabra1=$1 # Primer parametro recibido por la funcion
local palabra2=$2 # Segundo parametro recibido por la funcion
Cadena="$palabra1 $palabra2" # Cadena es una variable Global
}
if [ -z $P1 ] || [ -z $P2 ]
then
codError=1
echo "Escriba 2 palabras por favor"
else
# LLamo a la funcion Une y le paso como parametros P1 y P2
Une $P1 $P2
echo "$Cadena"
codError=0
fi
exit $codError
leer_fichero.sh
#!/bin/bash
# Leer fichero linea a linea
FICHERO="$1"
if [ -f "$FICHERO" ]
#|| [ -n "$FICHERO" ]
then
# Leemos el fichero
while read LINEA
do
# hacemos con la LINEA leida lo que deseemos
echo "$LINEA"
done < $FICHERO
exit 0
else
echo "Debe indicar un fichero y que contenga algo"
exit 1
fi
grabar_pantalla.sh
#!/bin/bash
# Este script graba la Pantalla 1
function Inicia {
FICH=$(tempfile --suffix=.avi)
zenity --info --text "** GRABACIÓN DE VÍDEO DE LA PANTALLA PRINCIPAL **\n\nSe va a grabar video del
NUMMONITORES=$(xrandr |grep '*'|wc -l)
# Solo se graba primer monitor
RESOLUCION=$(xrandr |grep current|awk -F "," '{print $2}' | awk -v NP=$NUMMONITORES '{print $2/NP"x
ffmpeg -y -f x11grab -s $RESOLUCION -r 25 -i :0.0 $FICH -loglevel quiet &
}
function Finaliza {
killall -9 ffmpeg
FICH=$(ls -1tr /tmp/*avi|tail -1)
zenity --info --text "** GRABACIÓN DE VÍDEO DE LA PANTALLA PRINCIPAL **\n\n¡ GRABACIÓN DETENIDA!\nS
}
function Ejecuta {
# Comprobamos si esta en ejecución
EJECUTANDOSE=$(ps aux |grep -i ffmpeg|grep -v grep|wc -l|awk '{print $1}')
if [ "$EJECUTANDOSE" = "1" ] ; then
Finaliza
else
Inicia
fi
}
# Lanzar el programa
Ejecuta
sudo_seguro.sh
Activa 'sudo' en modo seguro para tu usuario (pide contraseña para cada ejecución)
#!/bin/bash
# SUDO-SEGURO (Se pide la clave del usuario siempre)
# Este script crea un fichero para poder usar sudo al usuario
echo "Debe proporcionar la clave de root cuando se le solicite"
echo "$USER ALL=(ALL:ALL) ALL" > /tmp/autorizado_$USER; su -c "cp /tmp/autorizado* /etc/sudoers.d/."
sudo_comodo.sh
Activa 'sudo' en modo cómodo para tu usuario (No pide contraseña para la ejecución)
#!/bin/bash
# SUDO-COMODO (No se necesita la clave del usuario)
# Este script crea un fichero para poder usar sudo al usuario
echo "Debe proporcionar la clave de root cuando se le solicite"
echo "$USER ALL = (ALL) NOPASSWD: ALL" > /tmp/autorizado_$USER; su -c "cp /tmp/autorizado* /etc/sudoe
[Link]
#!/bin/bash
# Usamos tput (permite poner colores y/o mover el cursor por la pantalla)
LINEAS=$(tput lines)
COLUMNAS=$(tput cols)
Guia Bash
Descargar PDF de la Guía BASH
[Link] • 935 KB
Etiquetas
Luis GuLo
🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥
Formador de SysAdmin's - 💢 Ansible - ☁️Cloud Computing - ❤️Debian GNU/Linux
Sign up now
Recomendado para ti
hace 6 meses • 1 min de lectura hace 7 meses • 4 min de lectura hace 4 meses • 4 min de lectura