# Referencia Rápida de Bash

*Comandos, scripting, pipes, redirección, control de trabajos*

> Source: GNU Bash Manual (gnu.org/software/bash/manual) · MIT

## Fundamentos

### echo y Navegación

```
echo "Hello, World!"     # imprimir texto
pwd                      # mostrar directorio actual
cd /path/to/dir          # cambiar directorio
cd ..                    # subir un nivel
cd ~                     # ir al directorio home
cd -                     # ir al directorio anterior
```

### Listar y Crear

```
ls                # listar archivos
ls -la            # formato largo, mostrar ocultos
ls -lh            # tamaños legibles
mkdir mydir       # crear directorio
mkdir -p a/b/c    # crear directorios anidados
```

### Copiar, Mover y Eliminar

```
cp file.txt copy.txt      # copiar archivo
cp -r dir/ backup/        # copiar directorio recursivamente
mv old.txt new.txt        # renombrar / mover
rm file.txt               # eliminar archivo
rm -r dir/                # eliminar directorio recursivamente
rm -rf dir/               # eliminar forzado (sin confirmación)
```

## Variables y Expansión

### Variables

```
name="Alice"              # asignar (¡sin espacios!)
echo "$name"              # expansión de variable
echo "${name}_file"       # llaves para claridad
readonly PI=3.14          # constante
unset name                # eliminar variable
```

### Variables Especiales

| Command | Description |
|---------|-------------|
| `$0` | Nombre del script |
| `$1 $2 ...` | Argumentos posicionales |
| `$#` | Número de argumentos |
| `$@` | Todos los argumentos (palabras separadas) |
| `$*` | Todos los argumentos (cadena única) |
| `$?` | Estado de salida del último comando |
| `$$` | ID del proceso actual |
| `$!` | PID del último proceso en segundo plano |

### Sustitución de Comandos y Aritmética

```
files=$(ls)               # capturar salida
today=$(date +%Y-%m-%d)   # sustitución de comando
count=$((5 + 3))          # aritmética: 8
echo $((10 / 3))          # división entera: 3
echo $((10 % 3))          # módulo: 1
```

### Operaciones con Cadenas

| Command | Description |
|---------|-------------|
| `${#str}` | Longitud de cadena |
| `${str:0:5}` | Subcadena (desplazamiento:longitud) |
| `${str/old/new}` | Reemplazar primera coincidencia |
| `${str//old/new}` | Reemplazar todas las coincidencias |
| `${str^^}` | Mayúsculas |
| `${str,,}` | Minúsculas |

## Condicionales

### if / elif / else

```
if [[ "$name" == "Alice" ]]; then
    echo "Hi Alice"
elif [[ "$name" == "Bob" ]]; then
    echo "Hi Bob"
else
    echo "Who are you?"
fi
```

### Operadores de Prueba

| Command | Description |
|---------|-------------|
| `-eq  -ne` | Igual / distinto (enteros) |
| `-lt  -gt` | Menor / mayor que (enteros) |
| `-le  -ge` | Menor/mayor o igual (enteros) |
| `==  !=` | Igual / distinto (cadenas) |
| `-z "$str"` | Cadena vacía |
| `-n "$str"` | Cadena no vacía |
| `-f file` | Archivo existe y es regular |
| `-d dir` | Directorio existe |
| `-e path` | Ruta existe (cualquier tipo) |
| `-r  -w  -x` | Lectura / escritura / ejecución |
| `&&  \|\|` | AND / OR lógico |

## Bucles

### Bucle for

```
for fruit in apple banana cherry; do
    echo "$fruit"
done

for f in *.txt; do
    echo "File: $f"
done
```

### Bucle for Estilo C

```
for ((i=0; i<5; i++)); do
    echo "$i"
done
```

### Bucle while

```
count=0
while [[ $count -lt 5 ]]; do
    echo "$count"
    ((count++))
done
```

### Control de Bucles

| Command | Description |
|---------|-------------|
| `break` | Salir del bucle |
| `continue` | Saltar a la siguiente iteración |

## Funciones

### Definir y Llamar

```
greet() {
    echo "Hello, $1!"   # $1 = primer arg
    return 0             # estado de salida
}
greet "Alice"            # Hello, Alice!
```

### Variables Locales y Valores de Retorno

```
add() {
    local sum=$(($1 + $2))
    echo "$sum"          # "retornar" vía stdout
}
result=$(add 3 5)        # capturar: 8
```

## Pipes y Redirección

### Pipes

```
ls -l | grep ".txt"      # pipe de salida
cat log | sort | uniq    # encadenar comandos
cmd1 | tee out.txt       # pipe + guardar en archivo
```

### Redirección

| Command | Description |
|---------|-------------|
| `cmd > file` | Redirigir stdout (sobrescribir) |
| `cmd >> file` | Redirigir stdout (añadir) |
| `cmd < file` | Redirigir stdin desde archivo |
| `cmd 2> file` | Redirigir stderr |
| `cmd 2>&1` | Redirigir stderr a stdout |
| `cmd &> file` | Redirigir stdout + stderr |
| `cmd << EOF` | Here document (entrada en línea) |
| `/dev/null` | Descartar salida: `cmd > /dev/null` |

## Operaciones con Archivos

### Ver Archivos

```
cat file.txt             # mostrar archivo completo
head -n 10 file.txt      # primeras 10 líneas
tail -n 10 file.txt      # últimas 10 líneas
tail -f log.txt          # seguir (actualizaciones en vivo)
less file.txt            # visor paginado
```

### Contar y Buscar

```
wc -l file.txt           # contar líneas
wc -w file.txt           # contar palabras
wc -c file.txt           # contar bytes
find . -name "*.txt"     # buscar por nombre
find . -type d           # buscar directorios
find . -mtime -7         # modificados en últimos 7 días
```

### Otros Comandos de Archivos

| Command | Description |
|---------|-------------|
| `touch file` | Crear archivo / actualizar marca de tiempo |
| `stat file` | Metadatos del archivo (tamaño, fechas) |
| `file img.png` | Detectar tipo de archivo |
| `diff a.txt b.txt` | Comparar dos archivos |
| `sort file.txt` | Ordenar líneas |
| `uniq` | Eliminar duplicados adyacentes |
| `cut -d: -f1` | Extraer campos por delimitador |
| `tr 'a-z' 'A-Z'` | Traducir / reemplazar caracteres |

## Procesamiento de Texto

### grep

```
grep "error" log.txt       # buscar patrón
grep -i "error" log.txt    # sin distinción mayúsculas
grep -r "TODO" src/        # búsqueda recursiva
grep -n "func" file.go     # mostrar números de línea
grep -c "error" log.txt    # contar coincidencias
grep -v "debug" log.txt    # invertir coincidencia
```

### sed

```
sed 's/old/new/' file      # reemplazar primera por línea
sed 's/old/new/g' file     # reemplazar todas
sed -i 's/old/new/g' file  # editar en sitio
sed -n '5,10p' file        # imprimir líneas 5-10
sed '/pattern/d' file      # eliminar líneas coincidentes
```

### awk

```
awk '{print $1}' file      # imprimir primer campo
awk -F: '{print $1}' file  # delimitador personalizado
awk '$3 > 100' file        # filtrar por valor de campo
awk '{sum+=$1} END{print sum}' file  # sumar columna
```

## Permisos

### chmod

```
chmod 755 script.sh    # rwxr-xr-x
chmod +x script.sh     # agregar ejecución
chmod -w file.txt      # quitar escritura
chmod u+x,g-w file     # usuario +ejec, grupo -escritura
```

### Referencia de Permisos

| Command | Description |
|---------|-------------|
| `r (4)` | Lectura |
| `w (2)` | Escritura |
| `x (1)` | Ejecución |
| `u / g / o` | Usuario / Grupo / Otros |
| `755` | Propietario: rwx, Grupo/Otros: r-x |
| `644` | Propietario: rw-, Grupo/Otros: r-- |

### Propietario

```
chown user file.txt         # cambiar propietario
chown user:group file.txt   # cambiar propietario + grupo
chown -R user:group dir/    # recursivo
```
