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

HerramientaUso principal
curlConsultar APIs o descargar datos por HTTP/HTTPS
jqProcesar y filtrar JSON
yqProcesar 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:

  1. Reciba el nombre de un Pokémon como argumento.

  2. Use curl para consultar la API.

  3. Obtenga con jq:

    • Su nombre
    • Su peso
    • Sus habilidades
  4. 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:

  1. Pida el nombre de una ciudad al usuario.
  2. Use la API gratuita de wttr.in para obtener la temperatura actual:
1curl -s "https://wttr.in/$CIUDAD?format=3"
  1. 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

  1. ✅ Usa -s en curl para scripts (modo silencioso).
  2. ✅ Valida las respuestas de la API antes de procesarlas.
  3. ✅ Usa jq -r para obtener valores sin comillas.
  4. ✅ No guardes tokens sensibles en el script: usa variables de entorno.
  5. ✅ Para archivos de configuración, YAML es preferible y yq lo hace fácil de manipular.
  • Loading...