La guía del principiante para shell scripting los conceptos básicos
El término "shell scripting" se menciona a menudo en los foros de Linux, pero muchos usuarios no están familiarizados con él. Aprender este sencillo y poderoso método de programación puede ayudarlo a ahorrar tiempo, aprender mejor la línea de comandos y desterrar las tediosas tareas de administración de archivos..
¿Qué es shell scripting?
Ser un usuario de Linux significa que juegas con la línea de comandos. Nos guste o no, solo hay algunas cosas que se hacen mucho más fácilmente a través de esta interfaz que apuntando y haciendo clic. Cuanto más use y aprenda la línea de comandos, más verá su potencial. Bueno, la propia línea de comandos es un programa: el shell. La mayoría de las distribuciones de Linux de hoy usan Bash, y esto es en lo que realmente estás ingresando comandos.
Ahora, algunos de ustedes que usaron Windows antes de usar Linux pueden recordar archivos por lotes. Estos eran pequeños archivos de texto que podría llenar con comandos para ejecutar y Windows los ejecutaría a su vez. Era una forma inteligente y ordenada de hacer algunas cosas, como ejecutar juegos en el laboratorio de computación de su escuela secundaria cuando no podía abrir carpetas del sistema o crear accesos directos. Los archivos por lotes en Windows, aunque son útiles, son una imitación barata de los scripts de shell.
Los scripts de shell nos permiten programar comandos en cadenas y hacer que el sistema los ejecute como un evento con scripts, al igual que los archivos por lotes. También permiten funciones mucho más útiles, como la sustitución de comandos. Puede invocar un comando, como fecha, y usar su salida como parte de un esquema de denominación de archivos. Puede automatizar las copias de seguridad y cada archivo copiado puede tener la fecha actual anexada al final de su nombre. Los scripts no son solo invocaciones de comandos, tampoco. Son programas por derecho propio. Las secuencias de comandos le permiten utilizar funciones de programación, como los bucles 'for', las declaraciones if / then / else, etc., directamente dentro de la interfaz de su sistema operativo. Y, no tiene que aprender otro idioma porque está usando lo que ya sabe: la línea de comandos.
Ese es realmente el poder de los scripts, creo. Puede programar con comandos que ya conoce, mientras aprende los elementos básicos de la mayoría de los lenguajes de programación principales. ¿Necesitas hacer algo repetitivo y tedioso? Escríbelo! ¿Necesitas un atajo para un comando realmente complicado? Escríbelo! ¿Quieres construir una interfaz de línea de comandos realmente fácil de usar para algo? Escríbalo!
Antes de que empieces
Antes de comenzar nuestra serie de secuencias de comandos, vamos a cubrir algunos datos básicos. Usaremos el shell bash, que la mayoría de las distribuciones de Linux usan de forma nativa. Bash también está disponible para usuarios de Mac OS y Cygwin en Windows. Ya que es tan universal, deberías poder realizar guiones independientemente de tu plataforma. Además, siempre que existan todos los comandos a los que se hace referencia, los scripts pueden trabajar en múltiples plataformas con poco o ningún ajuste requerido.
Los scripts pueden hacer uso fácilmente de los privilegios de "administrador" o "superusuario", por lo que es mejor probar los scripts antes de ponerlos en práctica. También use el sentido común, como asegurarse de tener copias de seguridad de los archivos en los que está a punto de ejecutar un script. También es muy importante usar las opciones correctas, como -i para el comando rm, para que se requiera su interacción. Esto puede evitar algunos errores desagradables. Como tal, lea los scripts que descargue y tenga cuidado con los datos que tiene, en caso de que las cosas salgan mal..
En su núcleo, los scripts son solo archivos de texto plano. Puede usar cualquier editor de texto para escribirlos: gedit, emacs, vim, nano ... Esta lista continúa. Solo asegúrese de guardarlo como texto simple, no como texto enriquecido o un documento de Word. Ya que me encanta la facilidad de uso que proporciona nano, usaré esa.
Permisos y nombres de script
Los scripts se ejecutan como programas, y para que esto ocurra necesitan tener los permisos adecuados. Puede hacer que los scripts sean ejecutables ejecutando el siguiente comando:
chmod + x ~ / somecrazyfolder / script1
Esto permitirá que cualquiera ejecute ese script en particular. Si desea restringir su uso solo a su usuario, puede usar esto en su lugar:
chmod u + x ~ / somecrazyfolder / script1
Para ejecutar esta secuencia de comandos, tendría que grabar en el directorio adecuado y luego ejecutar la secuencia de comandos de esta manera:
cd ~ / somecrazyfolder
./ script1
Para hacer las cosas más convenientes, puede colocar los scripts en una carpeta "bin" en su directorio de inicio:
~ / bin
En muchas distribuciones modernas, esta carpeta ya no se crea de forma predeterminada, pero puede crearla. Esto suele ser donde se almacenan los archivos ejecutables que pertenecen a su usuario y no a otros usuarios. Al colocar los scripts aquí, puede ejecutarlos simplemente escribiendo su nombre, al igual que otros comandos, en lugar de tener que desplazarse y usar el prefijo './'.
Sin embargo, antes de nombrar un script, debe realizar el siguiente comando para verificar si tiene un programa instalado que usa ese nombre:
que [comando]
Muchas personas llaman a sus primeras secuencias de comandos "prueba" y, cuando intentan ejecutarlo en la línea de comandos, no sucede nada. Esto se debe a que entra en conflicto con el comando de prueba, que no hace nada sin argumentos. Siempre asegúrese de que los nombres de sus secuencias de comandos no entren en conflicto con los comandos, de lo contrario, es posible que se encuentre haciendo cosas que no pretende hacer!
Pautas de Scripting
Como mencioné antes, cada archivo de script es esencialmente texto plano. Sin embargo, eso no significa que puedas escribir lo que quieras de todas maneras. Cuando se intenta ejecutar un archivo de texto, los shells los analizarán en busca de pistas sobre si son scripts o no, y cómo manejar todo correctamente. Debido a esto, hay algunas pautas que debe conocer.
- Cada script debería estar con "#! / Bin / bash"
- Cada nueva línea es un nuevo comando.
- Las líneas de comentario comienzan con un #
- Los comandos están rodeados por ()
El Hash-Bang Hack
Cuando un shell analiza a través de un archivo de texto, la forma más directa de identificar el archivo como un script es hacer su primera línea:
#! / bin / bash
Si usas otro shell, sustituye su ruta aquí. Las líneas de comentarios comienzan con hashes (#), pero agregar el bang (!) Y la ruta del shell después de que sea una especie de hackeo que omitirá esta regla de comentarios y forzará que el script se ejecute con el shell al que apunta esta línea.
Nueva línea = Nuevo comando
Cada nueva línea debe considerarse un nuevo comando, o un componente de un sistema más grande. Si las declaraciones / then / else, por ejemplo, tomarán varias líneas, pero cada componente de ese sistema está en una nueva línea. No permita que un comando pase a la siguiente línea, ya que esto puede truncar el comando anterior y le da un error en la siguiente línea. Si su editor de texto está haciendo eso, debe desactivar el ajuste de texto para estar en el lado seguro. Puede desactivar el ajuste de texto en nano bit presionando ALT + L.
Comentar a menudo con #s
Si inicia una línea con un #, la línea se ignora. Esto lo convierte en una línea de comentarios, donde puede recordarse cuál fue la salida del comando anterior o qué hará el siguiente comando. Nuevamente, desactive el ajuste de texto o divida su comentario en varias líneas que empiecen con un hash. Usar muchos comentarios es una buena práctica, ya que le permite a usted y a otras personas modificar sus scripts con mayor facilidad. La única excepción es el hack Hash-Bang mencionado anteriormente, así que no sigas #s con! S. ;-)
Los comandos están rodeados por paréntesis
En días anteriores, las sustituciones de comandos se hacían con marcas de verificación simples (', comparte la tecla ~). No vamos a tocar esto todavía, pero como la mayoría de las personas salen y exploran después de aprender lo básico, probablemente sea una buena idea mencionar que en su lugar debería usar paréntesis. Esto se debe principalmente a que cuando anida (coloca los comandos dentro de otros comandos) los paréntesis funcionan mejor.
Tu primer guion
Comencemos con un script simple que le permite copiar archivos y anexar fechas al final del nombre de archivo. Llamémoslo "datecp". Primero, verifiquemos para ver si ese nombre está en conflicto con algo:
Puede ver que no hay salida del comando which, por lo que estamos listos para usar este nombre.
Vamos a crear un archivo en blanco en la carpeta ~ / bin:
toque ~ / bin / datecp
Y, cambiemos el permiso ahora, antes de que olvidemos:
Vamos a empezar a construir nuestro guión entonces. Abre ese archivo en el editor de texto que elijas. Como dije, me gusta la simplicidad de nano..
nano ~ / bin / datecp
Y, sigamos adelante y pongamos en la primera línea el requisito previo, y un comentario sobre lo que hace este script.
A continuación, declaremos una variable. Si alguna vez ha tomado álgebra, probablemente sepa qué es eso. Una variable nos permite almacenar información y hacer cosas con ella. Las variables pueden "expandirse" cuando se hace referencia en otro lugar. Es decir, en lugar de mostrar su nombre, mostrarán el contenido almacenado. Más tarde, puede indicar a esa misma variable que almacene información diferente, y cualquier instrucción que ocurra después de eso usará la nueva información. Es un marcador de posición muy elegante.
¿Qué vamos a poner en la variable? Bueno, vamos a guardar la fecha y la hora! Para ello, invocaremos el comando date..
Eche un vistazo a la captura de pantalla a continuación para ver cómo compilar la salida del comando date:
Puede ver que al agregar diferentes variables que comienzan con%, puede cambiar la salida del comando a lo que desee. Para obtener más información, puede consultar la página de manual del comando date..
Usemos la última iteración del comando date, "date +% m_% d_% y-% H.% M.% S", y usemos eso en nuestro script.
Si tuviéramos que guardar este script en este momento, podríamos ejecutarlo y nos daría la salida del comando date como esperábamos:
Pero, hagamos algo diferente. Demos un nombre de variable, como date_formatted a este comando. La sintaxis adecuada para esto es la siguiente:
variable = $ (comando -opciones argumentos)
Y para nosotros, lo construiríamos así:
date_formatted = $ (fecha +% m_% d_% y-% H.% M.% S)
Esto es lo que llamamos sustitución de comando. Básicamente, le decimos a bash que siempre que aparezca la variable "formateado con fecha", ejecute el comando dentro de los paréntesis. Luego, cualquier salida que proporcionen los comandos debe mostrarse en lugar del nombre de la variable, "date_formatted".
Aquí hay un ejemplo de script y su salida:
Tenga en cuenta que hay dos espacios en la salida. El espacio dentro de las comillas del comando echo y el espacio frente a la variable se muestran. No uses espacios si no quieres que aparezcan. También tenga en cuenta que sin esta línea de "eco" agregada, el script no dará ningún resultado..
Volvamos a nuestro guión. Añadamos a continuación en la parte de copia del comando.
cp -iv $ 1 $ 2. $ date_formatted
Esto invocará el comando de copia, con las opciones -i y -v. El primero le pedirá una verificación antes de sobrescribir un archivo, y el segundo mostrará lo que está abajo en la línea de comando.
A continuación, puede ver que he añadido la opción "$ 1". Al realizar una secuencia de comandos, un signo de dólar ($) seguido de un número indicará ese argumento numerado de la secuencia de comandos cuando se invocó. Por ejemplo, en el siguiente comando:
cp -iv Trogdor2.mp3 ringtone.mp3
El primer argumento es "Trogdor2.mp3" y el segundo argumento es "ringtone.mp3".
Mirando hacia atrás en nuestro script, podemos ver que estamos haciendo referencia a dos argumentos:
Esto significa que cuando ejecutamos el script, necesitaremos proporcionar dos argumentos para que el script se ejecute correctamente. El primer argumento, $ 1, es el archivo que se copiará y se sustituye como el primer argumento del comando "cp -iv".
El segundo argumento, $ 2, actuará como el archivo de salida para el mismo comando. Pero, también puedes ver que es diferente. Hemos agregado un período y hemos referenciado la variable "date_formatted" desde arriba. Curioso por lo que hace esto.?
Esto es lo que sucede cuando se ejecuta el script:
Puede ver que el archivo de salida aparece como lo que ingresé por $ 2, seguido por un período, luego la salida del comando de fecha. Tiene sentido cierto?
Ahora, cuando ejecuto el comando datecp, ejecutará este script y me permitirá copiar cualquier archivo en una nueva ubicación, y agregará automáticamente la fecha y la hora hasta el final del nombre de archivo. Útil para archivar cosas!
Shell scripting es la base de hacer que su sistema operativo funcione para usted. Tampoco tienes que aprender un nuevo lenguaje de programación para que esto suceda. Intente hacer scripts con algunos comandos básicos en casa y empiece a pensar en qué puede usar esto para.
¿Escribes? ¿Tienes algún consejo para los novatos? ¡Comparte tu opinión en los comentarios! Hay más por venir en esta serie.!