Pregunta 1¿Qué entra en $2 cuando ejecutas ./a.sh foo bar?
Argumentos y códigos de salida — controlar el script con $1 y exit
Este artículo forma parte del Curso de Linux, con el que dominarás desde cero habilidades prácticas de Linux, desde los comandos básicos hasta los scripts de shell.
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 # crear un archivo de ejemplo
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?