Curso de Shell Scripting
La mayoría de los servicios y aplicaciones modernas comunican datos en formatos JSON o YAML. Con Bash y unas pocas herramientas podemos consumir y procesar esa información de forma sencilla.
9.1. Herramientas necesarias
| Herramienta | Uso principal |
|---|---|
curl | Consultar APIs o descargar datos por HTTP/HTTPS |
jq | Procesar y filtrar JSON |
yq | Procesar YAML/TOML/JSON |
👉 Instala en Linux:
1sudo apt update 2sudo apt install curl jq 3sudo snap install yq
En macOS con Homebrew:
1brew install curl jq yq
9.2. curl: consultar APIs
curl permite obtener datos de una API REST.
Ejemplo: consultar la API pública de Pokémon
1curl -s https://pokeapi.co/api/v2/pokemon/pikachu
-s→ modo silencioso (no muestra barra de progreso)- Muestra un objeto JSON en la salida estándar.
9.3. jq: procesar JSON
jq es el estándar de facto para trabajar con JSON en scripts.
▸ Obtener un campo
1curl -s https://pokeapi.co/api/v2/pokemon/pikachu | jq '.name'
Salida:
"pikachu"
▸ Obtener un campo dentro de un objeto
1curl -s https://pokeapi.co/api/v2/pokemon/pikachu | jq '.abilities[0].ability.name'
Salida:
"static"
▸ Filtrar y mostrar varios campos
1curl -s https://pokeapi.co/api/v2/pokemon/pikachu | jq '{nombre: .name, peso: .weight}'
Salida:
1{ 2 "nombre": "pikachu", 3 "peso": 60 4}
▸ Iterar sobre un array
1curl -s https://pokeapi.co/api/v2/pokemon/pikachu | jq '.abilities[].ability.name'
Salida:
static
lightning-rod
▸ Convertir JSON a texto plano
1curl -s https://pokeapi.co/api/v2/pokemon/pikachu | jq -r '.name'
Salida:
pikachu
👉 La opción -r (raw output) elimina las comillas.
9.4. Autenticación con curl
Muchas APIs requieren token de acceso.
Ejemplo con cabecera Authorization:
1curl -s -H "Authorization: Bearer $TOKEN" https://api.example.com/data
9.5. Enviar datos (POST) con JSON
1curl -s -X POST -H "Content-Type: application/json" \ 2 -d '{"nombre":"Angel","edad":30}' \ 3 https://api.example.com/users
9.6. yq: procesar YAML/TOML
Muchos archivos de configuración (Kubernetes, Ansible, etc.) usan YAML.
Ejemplo: archivo config.yaml
1app: 2 name: demo 3 version: 1.2 4db: 5 host: localhost 6 port: 5432
Obtener el nombre de la app:
1yq '.app.name' config.yaml
Salida:
demo
Convertir YAML a JSON:
1yq -o=json '.' config.yaml
Modificar un valor:
1yq -i '.db.port = 3306' config.yaml
9.7. Ejemplo integrador: consultar API y guardar datos
Crea un script pokemon_info.sh que:
-
Reciba el nombre de un Pokémon como argumento.
-
Use
curlpara consultar la API. -
Obtenga con
jq:- Su nombre
- Su peso
- Sus habilidades
-
Guarde el resultado en
pokemon.json.
Ejemplo de ejecución:
1./pokemon_info.sh pikachu
Salida en terminal:
Nombre: pikachu
Peso: 60
Habilidades:
- static
- lightning-rod
Datos guardados en pokemon.json
🏋️♂️ Ejercicio práctico 1
Crea un script clima.sh que:
- Pida el nombre de una ciudad al usuario.
- Use la API gratuita de wttr.in para obtener la temperatura actual:
1curl -s "https://wttr.in/$CIUDAD?format=3"
- Muestre la temperatura en pantalla.
Ejemplo:
Introduce ciudad: Madrid
Madrid: 🌤️ +28°C
🏋️♂️ Ejercicio práctico 2
Tienes un archivo config.yaml con:
1usuarios: 2 - nombre: Ana 3 rol: admin 4 - nombre: Luis 5 rol: editor 6 - nombre: Maria 7 rol: viewer
Crea un script lista_admins.sh que use yq para listar solo los usuarios con rol admin.
Salida esperada:
Ana
✅ Buenas prácticas
- ✅ Usa
-sencurlpara scripts (modo silencioso). - ✅ Valida las respuestas de la API antes de procesarlas.
- ✅ Usa
jq -rpara obtener valores sin comillas. - ✅ No guardes tokens sensibles en el script: usa variables de entorno.
- ✅ Para archivos de configuración, YAML es preferible y
yqlo hace fácil de manipular.
- Loading...