Lo sé. Es una locura lo rápido que el escape complica el análisis de cadenas. Imagina escapar otros lenguajes dentro de strings de Bash, con todas esas comillas, apóstrofes y símbolos $ que te joden. 🫠
Dentro de comillas simples no se pueden escapar otras comillas simples con una barra invertida. Hay que cerrar la cadena, emitir una comilla escapada fuera de ella y volver a abrirla. La secuencia de cerrar‑comilla, escapar‑comilla, volver‑a‑abrir ('\'') permite la salida de:
It's 🔨 Time!
Hay otras formas de manejar esto, pero esta es la más común.
Las variables numeradas tienen un significado especial. En este caso, $1 es una variable especial que contiene el primer argumento pasado al script o función.
Como estamos ejecutando el script en un REPL, no hay argumentos, así que $1 está vacío. El texto restante 00 se imprime tal cual.
Para imprimir un carácter literal $, usa comillas simples o escápalo con una barra invertida (\\):
La sintaxis ${var/pattern/replacement} reemplaza la primera aparición de pattern con replacement. Aquí, la salida es:
Bark meow
Es sensible a mayúsculas y minúsculas. Para manejar tanto bark como Bark, usa un patrón como ${var/[Bb]ark/Bark} o normaliza la cadena antes de la sustitución.
Para reemplazar todas las apariciones, usa ${var//pattern/replacement}.
Para reemplazar desde el comienzo de la cadena, usa ${var/#pattern/replacement}.
Para reemplazar desde el final de la cadena, usa ${var/%pattern/replacement}.
¿Cómo puedes obtener la longitud de una variable en Bash?
La sintaxis ${#username} devuelve la longitud de username.
Por ejemplo:
Terminal window
username="@justsml"
echo ${#username} # => 8
Aunque wc funcionaría, técnicamente no forma parte de Bash.
La utilidad wc es una vieja broma interna que se refiere a “water closet”, o baño.
¡BROMA! ¿Alguien lee esto?
En realidad wc es un comando antiguo de POSIX (y de los días de AT&T Unix). Es la abreviatura de “word count” y puede contar líneas, palabras y caracteres en un archivo o flujo de entrada.
¿Qué imprime este script si el archivo cats.txt EXISTE?
Terminal window
if [ -e cats.txt]; then
echo"File exists"
else
echo"File does not exist"
fi
¿Notaste el espacio faltante antes del corchete de cierre?
Bash es bastante quisquilloso aquí: se requieren espacios dentro de las expresiones entre corchetes.
Como el espacio faltante hace que el comando [ no vea el ] de cierre, Bash muestra un diagnóstico, trata la prueba como fallida y continúa al bloque else.
La sintaxis correcta es:
Terminal window
if [ -e example.txt ]; then
echo"File exists"
else
echo"File does not exist"
fi
Nota: Los corchetes dobles [[ ]] están recomendados para expresiones condicionales. Ver BashFAQ.
Con [ ... ], Bash informa un diagnóstico y la condición es falsa, por lo que la rama else imprime Different cats. En Bash, usa = o == para comparaciones de igualdad.
Las funciones en Bash pueden aceptar argumentos. La variable $1 contiene el primer argumento pasado a la función.
Recuerda, $0 es el nombre del script, $1 es el primer argumento, $2 es el segundo, y así sucesivamente. Los espacios separan los argumentos. Así, greet Hi Dan pasa "Hi" como primer argumento. Para pasar "Hi Dan" como un solo argumento, deberías citarlo: greet "Hi Dan".
¿Qué opción ejecutará el comando ls -l y devolverá la salida?
La sintaxis $(ls -l) ejecuta el comando dentro de los paréntesis y sustituye la salida. Por ejemplo:
Terminal window
echo"Today is $(date +%F)"
# => Today is 2029-12-31
La primera opción usa comillas simples ', no acentos graves. Esto impide la expansión, de modo que '$(date +%F)' simplemente imprimirá la cadena literal $(date +%F).
Aunque todavía se admite usar acentos graves (`ls -l`) para ejecutar comandos, recientemente se ha convertido en una especie de anti‑patrón (en algunos contextos). La mayoría recomienda usar $(command) para mejor legibilidad y consistencia con diferentes shells y versiones.
Las llaves ${} se usan para expansión de variables, no para sustitución de comandos.
El carácter % no se usa para sustitución de comandos.
¿Qué operador se usa para combinar la salida de error con la salida estándar?
El operador 2>&1 redirige la salida de error estándar (descriptor de archivo 2) a la salida estándar (descriptor de archivo 1). Esto es útil para capturar los mensajes de error en el mismo flujo de salida que la salida normal.
El operador 1>&2 redirige la salida estándar a la salida de error, sin embargo, la pregunta pedía cómo redirigir la salida de error a la salida estándar.