Linux en Español

Scripting de Bash en Linux Parte 3 – Parámetros y opciones

Hasta ahora has visto cómo escribir scripts de bash de Linux que funcionan sin la entrada de los usuarios, en esta ocasión continuaremos nuestra serie acerca del scripting de bash, en especial el pase de parámetros y opciones.

Te recomiendo que revises las publicaciones anteriores si quieres saber de qué estamos hablando.

scripting de bash tutorial

scripting de bash ciclos For y While

 

Hoy aprenderemos cómo obtener los datos de entrda de un usuario y como tratar con esta entrada, para que nuestro script se vuelva más interactivo.

Para pasar datos a tu script de shell, debes utilizar los parámetros de la línea de comando.

$ ./myscript 3 5

Aquí enviamos 2 parámetros (3 y 5) al script. Entonces, ¿cómo se pueden leer estos parámetros

Parámetros de lectura

El shell te da algunas variables de lectura para procesar los parámetros de entrada:

  • $ 0 es el nombre del script.
  • $ 1 es el primer parámetro.
  • $ 2 es el segundo parámetro.

Hasta el noveno parámetro, que es $ 9

A continuación, vamos a ver estos parámetros en acción:

#!/bin/bash

echo $0 # Script name

echo $1 # 1st parameter

echo $2 # 2nd parameter

echo $3 # 3rd parameter

Verifica los resultados del siguiente comando:

./myscript 5 10 15

Linux Parámetros y opciones

Este es otro ejemplo de cómo podemos usar dos parámetros y calcular la suma de ellos.

#!/bin/bash

total=$(( $1 + $2 ))

echo First passed parameter is $1.

echo Second passed parameter is $2.

echo Total is $total.
$ ./myscript 5 10

parámetros

Los parámetros no están restringidos a números, podrían ser cadenas de caracteres como la siguiente:

#!/bin/bash

echo Hello $1, how do you do
./myscript Adam

El resultado es el esperado.

string parámetros

¿Qué pasa si nuestro parámetro contiene un espacio y queremos pasarlo como un valor? Supongo que sabes la respuesta de las publicaciones anteriores. La respuesta es utilizar comillas.

Si tú script requiere más de nueve parámetros, debes utilizar llaves de la siguiente forma $ {10}.

 

Verificar parámetros

Si no pasas los parámetros y tu código los espera, tu script se cerrará con un error.

Es por eso que deberíamos hacer una sentencia if para asegurarnos de que existen.

#!/bin/bash

if [ -n "$1" ]; then # If first parameter passed then print Hi

	echo Hi $1.

else

	echo "No parameters found. "

fi

Verificar parámetros

Contando parámetros

Para obtener la cantidad de parámetros pasados, puede utilizar esta variable ($ #).

#!/bin/bash

echo There were $# parameters passed.
./myscript 1 2 3 4 5

Contando parámetros

¿ves cuan impresionante es el scripting de bash de Linux? Esta variable también proporciona una forma geek para obtener el último parámetro. Mira este truco:

#!/bin/bash

echo Last passed parameter is ${!#}

último parámetro

Iterar sobre los parámetros

La variable $ * contiene todos los parámetros como un solo valor.

La variable $ @ contiene todos los parámetros como valores separados, por lo que puede iterar sobre ellos.

Este código muestra cómo utilizarlos:

#!/bin/bash

echo "The first variable \$* method: $*"

echo "-----------"

echo "The second variable \[email protected] method: [email protected]"

Iterar sobre los parámetros

El resultado es el mismo, pero si quieres saber la diferencia mira el siguiente ejemplo:

#!/bin/bash

total=1

for var in "$*"; do

	echo "\$* =======> #$total = $var"

	total=$(($total + 1))

done

total=1

for var in "[email protected]"; do

	echo "\[email protected] =======> #$total = $var"

	total=$(($total + 1))

done

Verifica el resultado para ver la diferencia:

conteo de parámetros

El resultado es bastante claro. Puedes usar cualquiera según tus necesidades.

 

Variable de desplazamiento de parámetros

El comando shift mueve cada parámetro de variable a la izquierda:

variable $ 3 ==> variable $ 2.

variable $ 2 ==> variable $ 1.

variable $ 1 ==> eliminada.

variable $ 0 ==> (el nombre del script) no se modifica.

Puede usar el comando shift para iterar sobre parámetros como se muestra a continuación:

#!/bin/bash

total=1

while [ -n "$1" ]; do # while loop starts

	echo "#$total = $1"

	total=$(($total + 1))

	shift

done

Aquí, tenemos un ciclo while que comprueba la longitud de $ 1. Si $ 1 se convierte en cero, el ciclo se detiene. Y el comando shift está desplazando todos los parámetros pasados a la izquierda.

Variable de desplazamiento de parámetros

Ten cuidado al utilizar el comando shift, el parámetro desplazado se ha eliminado y no se puede recuperar.

 

Opciones de scripts de Bash

Las opciones son letras simples con un guion antes.

#!/bin/bash

echo

while [ -n "$1" ]; do # while loop starts

	case "$1" in

	-a) echo "-a option passed" ;; # Message for -a option

	-b) echo "-b option passed" ;; # Message for -b option

	-c) echo "-c option passed" ;; # Message for -c option

	*) echo "Option $1 not recognized" ;; # In case you typed a different option other than a,b,c

	esac

	shift

done
$ ./myscript -op1 -op2 -op3 -op4

Opciones de scripts de Bash

El código verifica las opciones. Si escribiste alguna, se ejecutarán los comandos adecuados.

 

Parámetros y opciones: Como separarlos

Algunas veces necesitas usar opciones y parámetros en el mismo script. Tienes que separarlos. Al hacer esto, le está diciendo al bash dónde están los parámetros y dónde están las opciones.

El doble guion (–) se utiliza para finalizar la lista de opciones. Después de que el shell ve el doble guion, las entradas restantes se tratan como parámetros y no como opciones.

#!/bin/bash

while [ -n "$1" ]; do # while loop starts

	case "$1" in

	-a) echo "-a option passed" ;; # Message for -a option

	-b) echo "-b option passed" ;; # Message for -b option

	-c) echo "-c option passed" ;; # Message for -c option

	--)
		shift # The double dash which separates options from parameters

		break
		;; # Exit the loop using break command

	*) echo "Option $1 not recognized" ;;

	esac

	shift

done

total=1

for param in [email protected]; do

	echo "#$total: $param"

	total=$(($total + 1))

done
$ ./myscript -a -b -c -- 5 10 15

Parámetros y opciones

Como puedes ver en el resultado, todos los parámetros después del doble guion son tratados como parámetros y no como opciones.

 

Procesar opciones con valores

Cuando profundizas en la creación de scripts de bash de Linux, a veces necesitas opciones con valores de parámetros adicionales como las siguientes:

./myscript -a value1 -b -c value2

Debería haber una manera de identificar cualquier parámetro adicional para las opciones y poder procesarlo.

#!/bin/bash

while [ -n "$1" ]; do # while loop starts

	case "$1" in

	-a) echo "-a option passed" ;;

	-b)
		param="$2"

		echo "-b option passed, with value $param"

		shift
		;;

	-c) echo "-c option passed" ;;

	# The double dash makes them parameters

	--)
		shift

		break
		;;

	*) echo "Option $1 not recognized" ;;

	esac

	shift

done

total=1

for param in "[email protected]"; do

	echo "#$total: $param"

	total=$(($total + 1))

done

Y si lo ejecutamos con estas opciones:

$ ./myscript -a -b test1 -d

Procesar opciones con valores

A partir de los resultados, puede ver que obtenemos el parámetro para la opción -b usando la variable $ 2.

 

Opciones estándar

Cuando inicies tu script de bash, puede elegir qué letra es la más adecuada para la opción que desees.

Sin embargo, hay algunas letras que se usan comúnmente en los programas de Linux.

Aquí está la lista de las opciones comunes:

-a         Listar todos los elementos.

-c         Obtener la cantidad de elementos.

-d         Directorio de salida.

-e         Expandir elementos.

-f         Especificar un archivo.

-h         Mostrar la página de ayuda.

-i          Ignorar mayúsculas.

-l          listar un texto.

-n         Decir que no a una pregunta.

-o         Para enviar la salida a un archivo o más.

-q         No preguntar al usuario.

-r         Procesar algo recursivamente.

-s         Modo sigiloso.

-v         Modo detallado.

-x         Especificar el ejecutable.

-y         Decir sí sin preguntar al usuario.

Si trabajas con Linux, muchas de estas opciones pueden resultarte familiares.

Es bueno seguir los estándares.

 

Obtener la entrada del usuario utilizando el comando read

Algunas veces necesitas datos del usuario mientras se ejecuta el script de bash.

El shell de bash utiliza el comando read para este propósito.

El comando read lee la entrada desde el STDIN (el teclado) o desde un descriptor de archivo y la almacena en una variable:

#!/bin/bash

echo -n "What's your name: "

read name

echo "Hi $name,"

La opción -n se usa para deshabilitar la nueva línea, por lo que puedes escribir tu texto en la misma línea..

Obtener la entrada del usuario

Puedes especificar entradas múltiples como se muestra a continuación:

#!/bin/bash

read -p "What's your name: " first last

echo "Your data for $last, $first…"

entrada múltiple

Si no especificas variables para el comando de lectura, todas las entradas se guardan en la variable REPLY.

#!/bin/bash

read -p "What's your name: "

echo Hello $REPLY,.

variable de respuesta

Puedes utilizar la opción -t para especificar un tiempo de espera para la entrada en segundos.

#!/bin/bash

if read -t 5 -p "What's your name: " name; then

	echo "Hi $name, how are you?"

else

	echo "You took much time!"

fi

Si no ingresas datos durante cinco segundos, el script ejecutará la sentencia else e imprimirá un mensaje de disculpas.

se acabó el tiempo

Leer contraseñas

En el scripting de bash de Linux, a veces no deseas que la entrada del usuario se muestre en la pantalla, como al ingresar una contraseña.

La opción -s oculta los datos ingresados en el comando read.

Los datos se imprimen realmente en la pantalla, pero el comando read hace que el color del texto sea del color de fondo del shell.

#!/bin/bash

read -s -p "Enter password: " mypass

echo "Your password is $mypass? "

entrada oculta

Leer archivos

El comando read puede leer archivos de una línea en cada llamada.

Si desea obtener todos los datos de archivo, puede obtener el contenido utilizando el comando cat y luego enviarlo al comando read utilizando un ciclo while de la siguiente manera:

#!/bin/bash

count=1

# Get file content then pass to read command by iterating over lines using while command

cat myfile | while read line; do

	echo "#$count: $line"

	count=$(($count + 1))

done

echo "Finished"

O podemos simplificarlo redireccionando el contenido del archivo al ciclo while de esta manera:

#!/bin/bash

while read line; do

	echo $line

done <myfile

Leer archivos

Pasamos el contenido del archivo al ciclo while e iteramos sobre cada línea e imprimimos el número de línea y el contenido, además, con cada iteración aumentamos el conteo en uno.

Espero que encuentres esta publicación acerca de los parámetros y opciones interesante. Espero vuelvas pronto.

Gracias.

Mokhtar Ebrahim
Fundadora de LikeGeeks. Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

2 thoughts on “Scripting de Bash en Linux Parte 3 – Parámetros y opciones

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *