Parámetros Línea de Comandos. Bash
SOLUCIONARIO
Parámetros Línea de Comandos. Bash
2025-10-26
Por
Occam's Razor

#!/bin/sh
echo "$# Parameters..."

c=1
for i in  $@ 
do
    echo "Parameter $c : $i"
    c=$(( c + 1 ))
done

if [ $# -ne 1 ]
then
    echo "Just one parameter please"
    exit 85
fi
echo "Hello $1"

Bash, utiliza variables especiales para permitirnos el acceso a los parámetros que pasamos al script. La variable $# contiene el número de parámetros que recibimos. y la cadena $@ contendrá los parámetros separados por espacios, los cuales podremos separar fácilmente utilizando un bucle for.

SABIAS QUE?

Desde la versión 5 de bash es posible acceder y modificar el parámetro $0 del script usando la variable especial BASH_ARGV0, sin embargo, modificar esta variable no hace que el nombre del script que muestra ps se modifique. Es posible modificar el nombre de un script ejecutándolo con exec :

$ exec -a "Nuevo Nombre" bash tu_script.sh

Sin embargo, no hay una forma sencilla de modificar el nombre del proceso mostrado por ps desde el propio script.

Otras formas alternativas de acceder a los parámetros se muestran a continuación:

ARGC=$#
for ((i = 1; i <= $ARGC; i++)) do
    echo "Parametro $i : ${!i}"
done
echo "---"
i=1
while (( $# )); do
    echo "Parametro $i : $1"
    i=$((i + 1))
    shift
done

El comando shift desplaza los parámetros de hacia la izquierda. Bash nombra los parámetros que recibimos como $0 (el nombre del script), $1 (el primero), $2 (el segundo) y así sucesivamente. El comando shift copiará $1 en $0, $2 en $1, y así sucesivamente.

SABÍAS QUE

El comando shift acepta un parámetro que nos permite desplazar los parámetros tantas posiciones como deseemos

Como podéis ver, cada vez, cada vez ejecutamos shift, el tamaño del array se reduce y por lo tanto podemos recorrer los parámetros poniendo una condición en el tamaño del mismo while (($#)). Notad el uso del doble paréntesis.

Bash no define el concepto de librería o módulo como otros lenguajes y normalmente debe utilizar programas externos para conseguir este tipo de funcionalidad. El programa getopt nos permite procesar la línea de comandos interpretando de forma sencilla, distintas opciones y sus parámetros. El ejemplo a continuación muestra como utilizar este programa en nuestros scripts bash:

#!/bin/bash
#

ayuda () {
cat <<EOF
Usar $(basename "$0") [opciones]

Opciones:
    -h, --help      Ayuda
    -i, --input     Fichero de entrada opcional
    -o, --putput    Fichero de salida opcional
EOF
}

PARSED=$(getopt -o hi:o: -l help,input:,output: -- "$@")
if [[ $? -ne 0 ]]
then 
    ayuda
    exit 1
fi

input_file="input.txt"
output_file="output.txt"

# Reordena parametros
eval set -- "$PARSED"

while true; do
  case "$1" in
    -h|--help)
      ayuda
      exit 0
      ;;
    -i|--input)
        input_file="$2"
        shift 2
      ;;
    -o|--output)
        output_file="$2"
    shift 2
      ;;
    --)
      shift
      break
      ;;
    *)
      echo "Unknown option: $1"
      ayuda
      exit 1
      ;;
  esac
done
echo "Fichero entrada : $input_file"
echo "Fichero salida : $output_file"

El script es bastante sencillo de seguir, si bien hay dos questiones que debemos explicar.

  • El programa getopt nos permite definir parámetros cortos (con el flag -o) y largos (con el flag -l). Cuando al nombre del parámetro siguen dos puntos (:) eso indica que ese parámetro requiere un argumento.
  • Una vez procesados los parámetros debemos ejeuctar eval set -- "$PARSED" esta instrucción reordena los parámetros para que podamos procesarlos en el orden adecuado en el while que sigue a continuación
  • El while simplemente recorre la lista de argumentos lo cual es mucho más sencillo puesto que los parámetros van a estar ordenados.

Resumen

  • Bash recibe los argumentos de la línea de comandos en el array $@
  • $@ contine cadenas de caracteres
  • $0 contiene el nombre del script. Este valor no se puede modificar
  • El programa externo getopt se puede utilizar para procesar la línea de comandos

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)