#!/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
$0del script usando la variable especialBASH_ARGV0, sin embargo, modificar esta variable no hace que el nombre del script que muestrapsse modifique. Es posible modificar el nombre de un script ejecutándolo conexec:$ exec -a "Nuevo Nombre" bash tu_script.shSin embargo, no hay una forma sencilla de modificar el nombre del proceso mostrado por
psdesde 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
doneEl 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
shiftacepta 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
getoptnos 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
whilesimplemente 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$0contiene el nombre del script. Este valor no se puede modificar- El programa externo
getoptse puede utilizar para procesar la línea de comandos
■
