Pregunta 1¿Qué entra en $2 cuando ejecutas ./a.sh foo bar?
Script de Shell - Argumentos y códigos de salida
Recibe los valores de ./a.sh foo bar con $1 $2 $@ $# $0, aporta un valor predeterminado con ${2:--}, comprueba $? y devuelve éxito o fallo con exit 0 / exit 1 — escribe y ejecuta un script práctico, ilustrado en una terminal del navegador.
Recibir argumentos — $1 / $2 / $0
Los scripts pueden tomar valores cuando los ejecutas.
Los valores que pones después del comando, como ./a.sh foo bar, se llaman argumentos, y dentro del script $1 es el primero y $2 es el segundo.
$0 es el nombre del propio script, $# es el número de argumentos pasados y $@ representa todos ellos en conjunto.
Con estos puedes ejecutar el script con una entrada distinta cada vez en lugar de con valores fijos.
| Sintaxis | Significado | Ejemplo |
|---|---|---|
$1 $2 | Primer y segundo argumento | echo "$1 then $2" |
$0 | El nombre del propio script | echo "running $0" |
$# | Número de argumentos pasados | echo "argc=$#" |
$@ | Todos los argumentos en conjunto | echo "all: $@" |
$1 $2; $# da el conteo y $@ el conjunto completo.set -- foo bar # fija parámetros posicionales para la demo
echo "1st: $1" # foo
echo "2nd: $2" # bar
echo "argc: $#" # 2
echo "all: $@" # foo bar
Aportar un valor predeterminado — ${1:-def}
A veces no se pasa ningún argumento.
Si escribes ${1:-default}, se usa default cuando $1 no está definido o está vacío, y se usa el valor dado cuando se proporciona uno.
Esto te permite escribir un script que sigue el argumento cuando se da, y funciona con un valor predeterminado seguro cuando no.
Comprobar $# también te dice si llegó el número esperado de argumentos.
| Sintaxis | Significado | Ejemplo |
|---|---|---|
${1:-def} | Usa def cuando $1 no está definido | name=${1:-guest} |
${2:-def} | Usa def cuando $2 no está definido | sep=${2:--} |
${2:--}, pasar un segundo valor lo usa, y omitirlo usa el predeterminado -.set -- # reproduce la ejecución sin argumentos
echo "${1:-guest}" # no definido, así que guest
set -- alice # ahora el primer argumento está fijado
echo "${1:-guest}" # tiene un valor, así que alice
Devolver éxito o fallo — $? y exit N
Cuando un comando termina devuelve un código de salida, un número de 0 a 255.
Por convención 0 significa éxito y cualquier cosa distinta de 0 significa fallo.
Puedes leer el código de salida del comando anterior con $?.
Para grep es 0 cuando encuentra y 1 cuando no, así que el valor cambia según el resultado.
Desde dentro de un script fijas el código de salida explícitamente con exit N.
Devolver exit 0 para éxito y exit 1 para fallo es la convención común.
Quien lo llama recibe este valor a través de $? o && || y puede usarlo para controlar el flujo, como seguir solo cuando hay éxito.
Si omites exit, se devuelve tal cual el código de salida del último comando ejecutado.
| Sintaxis | Significado | Ejemplo |
|---|---|---|
$? | Código de salida del comando anterior | grep x f; echo $? |
exit N | Termina el script con el código de salida N | exit 1 |
exit 0 en caso de éxito y exit 1 en caso de fallo, y quien lo llama lee el resultado con $?.printf 'apple\nbanana\n' > fruits.txt # crea el material
grep apple fruits.txt > /dev/null
echo "found? $?" # encontrado, así que 0
grep mango fruits.txt > /dev/null
echo "found? $?" # no encontrado, así que 1
Procesar cada argumento por turno — $@ y $#
Cuando el número de argumentos no es fijo, en lugar de escribir $1 $2 uno por uno, recorre $@ con for para procesar tantos como se hayan pasado.
La forma for x in "$@"; do … done los toma de uno en uno, y mostrar el conteo con $# permite que el mismo script maneje cualquier número de argumentos.
Es un patrón común en herramientas que procesan varios archivos juntos.
| Sintaxis | Significado | Ejemplo |
|---|---|---|
"$@" | Pasa cada argumento palabra por palabra (para for; necesita comillas dobles) | for x in "$@"; do |
$# | Número de argumentos pasados | echo "count=$#" |
$#, luego toma cada argumento de uno en uno con $@ en un bucle for para procesarlos.set -- foo bar baz # fija parámetros posicionales para la demo
echo "argc: $#" # 3
for x in "$@"; do
echo "- $x" # - foo / - bar / - baz
done
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cuál es el significado correcto de ${1:-guest}?
Pregunta 3¿Cuál lee el código de salida que indica si el comando anterior tuvo éxito?