Bash
Secuencias de comandos con parámetros
Buscar..
Observaciones
-
shift
desplaza los parámetros de posición a la izquierda de modo que$2
convierte en$1
,$3
convierte en$2
y así sucesivamente. -
"$@"
es una matriz de todos los parámetros posicionales pasados al script / función. -
"$*"
es una cadena compuesta por todos los parámetros posicionales pasados al script / función.
Análisis de múltiples parámetros
Para analizar una gran cantidad de parámetros, la forma preferida de hacer esto es usar un bucle while, una declaración de caso, y el desplazamiento.
shift
se usa para mostrar el primer parámetro de la serie, lo que solía ser $ 2 , ahora $ 1 . Esto es útil para procesar argumentos uno a la vez.
#!/bin/bash
# Load the user defined parameters
while [[ $# > 0 ]]
do
case "$1" in
-a|--valueA)
valA="$2"
shift
;;
-b|--valueB)
valB="$2"
shift
;;
--help|*)
echo "Usage:"
echo " --valueA \"value\""
echo " --valueB \"value\""
echo " --help"
exit 1
;;
esac
shift
done
echo "A: $valA"
echo "B: $valB"
Entradas y salidas
$ ./multipleParams.sh --help
Usage:
--valueA "value"
--valueB "value"
--help
$ ./multipleParams.sh
A:
B:
$ ./multipleParams.sh --valueB 2
A:
B: 2
$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2
Parámetros de acceso
Al ejecutar un script de Bash, los parámetros pasados en el script se nombran de acuerdo con su posición: $1
es el nombre del primer parámetro, $2
es el nombre del segundo parámetro, y así sucesivamente.
Un parámetro faltante simplemente se evalúa como una cadena vacía. La comprobación de la existencia de un parámetro se puede hacer de la siguiente manera:
if [ -z "$1" ]; then
echo "No argument supplied"
fi
Obteniendo todos los parametros
$@
y $*
son formas de interactuar con todos los parámetros del script. Haciendo referencia a la página de Bash , vemos que:
-
$*
: Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión ocurre entre comillas dobles, se expande a una sola palabra con el valor de cada parámetro separado por el primer carácter de la variable especial IFS. -
$@
: Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión ocurre dentro de comillas dobles, cada parámetro se expande a una palabra separada.
Obtener el número de parámetros
$#
obtiene el número de parámetros pasados a un script. Un caso de uso típico sería verificar si se pasa el número apropiado de argumentos:
if [ $# -eq 0 ]; then
echo "No arguments supplied"
fi
Ejemplo 1
Recorre todos los argumentos y verifica si son archivos:
for item in "$@"
do
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Ejemplo 2
Recorre todos los argumentos y verifica si son archivos:
for (( i = 1; i <= $#; ++ i ))
do
item=${@:$i:1}
if [[ -f $item ]]; then
echo "$item is a file"
fi
done
Análisis de argumentos utilizando un bucle for
Un ejemplo simple que proporciona las opciones:
Optar | Alt. Optar | Detalles |
---|---|---|
-h | --help | Mostrar ayuda |
-v | --version | Mostrar información de la versión |
-dr path | --doc-root path | Una opción que toma un parámetro secundario (una ruta) |
-i | --install | Una opción booleana (verdadero / falso) |
-* | - | Opción inválida |
#!/bin/bash
dr=''
install=false
skip=false
for op in "$@";do
if $skip;then skip=false;continue;fi
case "$op" in
-v|--version)
echo "$ver_info"
shift
exit 0
;;
-h|--help)
echo "$help"
shift
exit 0
;;
-dr|--doc-root)
shift
if [[ "$1" != "" ]]; then
dr="${1/%\//}"
shift
skip=true
else
echo "E: Arg missing for -dr option"
exit 1
fi
;;
-i|--install)
install=true
shift
;;
-*)
echo "E: Invalid option: $1"
shift
exit 1
;;
esac
done
Guión envoltorio
El script Wrapper es un script que envuelve otro script o comando para proporcionar funcionalidades adicionales o simplemente para hacer algo menos tedioso.
Por ejemplo, el egrep
real en el nuevo sistema GNU / Linux está siendo reemplazado por un script envoltorio llamado egrep
. Así es como se ve:
#!/bin/sh
exec grep -E "$@"
Entonces, cuando ejecuta egrep
en tales sistemas, en realidad está ejecutando grep -E
con todos los argumentos reenviados.
En el caso general, si desea ejecutar un ejemplo script / comando exmp
con otro guión mexmp
entonces el envoltorio mexmp
guión se verá así:
#!/bin/sh
exmp "$@" # Add other options before "$@"
# or
#full/path/to/exmp "$@"
Dividir cadena en una matriz en Bash
Digamos que tenemos un parámetro String y queremos dividirlo con una coma
my_param="foo,bar,bash"
Para dividir esta cadena por comas podemos utilizar;
IFS=',' read -r -a array <<< "$my_param"
Aquí, IFS es una variable especial llamada Separador de campo interno que define el carácter o caracteres utilizados para separar un patrón en tokens para algunas operaciones.
Para acceder a un elemento individual:
echo "${array[0]}"
Para iterar sobre los elementos:
for element in "${array[@]}"
do
echo "$element"
done
Para obtener tanto el índice como el valor:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done