La forma en que he aprendido cualquier lenguaje no es sentarse y leer un libro sobre él sólo para aprenderlo, sino tener un propósito en mente:
Quiero automatizar X.
Entonces empiezo a pensar en el problema, y luego uso Internet para averiguar la sintaxis que me lleve de A a B.
Por ejemplo, hace años quise hacer un seguimiento de los tiempos de funcionamiento de mi sistema, cuando acababa de pasar de Windows, que había que reiniciar cada 48 horas, y también porque era un gran empollón. Me burlaba de un amigo online con ello, así que quería actualizar el tiempo de actividad de mi sistema aquí en casa, en una página web que estaba alojada fuera en Internet, en un servidor en otro estado.
¿Cómo hacer esto?
Bueno, en primer lugar, cómo empiezo a hacer un script que realmente se ejecute.
#!/bin/bash <- Oh, specifies the script interpreter. LEARNED.
Hm, todavía no se ejecuta…
# chmod +x <- Oh, needs execute bit set. LEARNED.
Ahora, ¿cómo coger el uptime? Bueno, podría desarmar el comando uptime, pero una de las características que quería era rastrear mi «record uptime». El comando uptime de Linux muestra los tiempos de actividad en una forma legible para el ser humano:
13:23:54 up 32 days, 4:19
Bueno, eso es un poco difícil de analizar como mayor o menor que. Se puede hacer, pero debe haber una forma más sencilla. Me pregunto de dónde saca esos datos el programa «uptime». Un poco de google me lleva al sistema /proc:
/proc/uptime
¿Cómo leo eso? Hay varias maneras. La manera que usé por costumbre (y probablemente es la manera incorrecta ya que el comando cat no está realmente destinado a esto es:)
cat /proc/uptime
Que devuelve:
2780345.41 5546896.19
OK, ahora tenemos bonitos decimales que hacen que averiguar si es un registro de tiempo de actividad más fácil. Pero, ¿cómo puedo coger eso en una variable? Leí un poco más en internet sobre las comillas:
UPTIME=`cat /proc/uptime`
Bien, ahora lo tengo en una variable. Nota mental, puedes leer todo tipo de cosas interesantes en las variables de esta manera. Debo recordarlo en el futuro. APRENDÍ. Además, ¿qué es eso de /proc? Ooh, todo tipo de cosas buenas allí como:
cat /proc/cpuinfo
OK así que ahora tengo este gran número decimal. ¿Cómo lo convierto en días, para tener tiempos de funcionamiento como «23,8 días»? También cat /proc/cpuinfo devuelve dos números. ¿Cuál quiero? ¿Y cómo lo separo para tener sólo ese número? He leído un poco más. Hay varias formas de separar una cadena, pero lo primero que encuentro es el comando cut. ¿Cómo puedo usar eso con una cadena? Leo un artículo sobre la canalización y la redirección. Veo que los dos números están separados por un espacio como delimitador, así que:
NUMBERIWANT=`echo ${uptime} | cut -d " " -f 1`
Cool. Debo recordarlo. Puedo hacer cosas interesantes con esa tubería. Lo archivo mentalmente, junto con el comando cut, que será una de las herramientas de línea de comandos más útiles que he encontrado.
Ahora, cómo convertir eso en días…hm, decepcionante, bash tiene un soporte matemático de mierda. Hm, este artículo habla de bc. Un poco de experimentación y:
uptime=`echo "scale=2; $uptime/86400" | bc`
Así que bc es el programa que se usa para hacer cálculos. Tendré que recordarlo. Aprendí sobre las comillas y la tubería en los pasos anteriores, así que era obvio cómo usar eso aquí.
Ahora, ¿cómo hago eco de esto a un archivo de texto que puedo usar como un include de PHP en el sitio web (PHP aprendió mucho de la misma manera)?
Ah, ¡redirección!
echo $uptime > ./uptime.txt
Y así sucesivamente. Si miro mis viejos scripts (este incluido), la codificación es ineficiente y no necesariamente como lo haría ahora. Pero a medida que sigo este proceso a lo largo de los años, mis habilidades y mi conjunto de conocimientos mejoran, y al arrinconarme por las malas prácticas, aprendo cómo no hacer las cosas. Mis metodologías mejoran para que los scripts sean más mantenibles – no a través de sentarse en un salón de clases o leer un libro, sino metiendo la pata y aprendiendo de ello.
NOTA: No soy un desarrollador profesional. Escribo scripts principalmente para mis propios fines (de aficionado). Sé que la gente con formación informática puede tener objeciones a este método de aprendizaje, pero hasta ahora me ha funcionado bien. Y es muy divertido porque en lugar de ser sólo una especie de ejercicio cotidiano de lectura y memorización, estoy consiguiendo algo «fuera de él» a medida que avanzo – scripts útiles.
Por cierto – marca esto si no lo has hecho. Es fantástico:
Guía avanzada de Bash Scripting — la mayor parte de lo que sé sobre Bash ha venido de aquí.