La Guía para principiantes de Shell Scripting 2: Para bucles

Tabla de contenido:

Video: La Guía para principiantes de Shell Scripting 2: Para bucles

Video: La Guía para principiantes de Shell Scripting 2: Para bucles
Video: SAMSUNG A22 ✅ Ponte en MODO EXPERTO con estos TIPS y TRUCOS📲 | 👉 Orientador movil 2024, Marcha
La Guía para principiantes de Shell Scripting 2: Para bucles
La Guía para principiantes de Shell Scripting 2: Para bucles
Anonim
Si desea construir su credito geek, únase a nosotros para la segunda entrega de nuestra serie de scripts de shell. Tenemos algunas correcciones, algunas mejoras al guión de la semana pasada y una guía sobre el bucle para los no iniciados.
Si desea construir su credito geek, únase a nosotros para la segunda entrega de nuestra serie de scripts de shell. Tenemos algunas correcciones, algunas mejoras al guión de la semana pasada y una guía sobre el bucle para los no iniciados.

El script de datecp revisado

En la primera entrega de nuestra guía de shell scripting, creamos una secuencia de comandos que copiaba un archivo a un directorio de respaldo después de agregar la fecha al final del nombre de archivo.

Samuel Dionne-Riel señaló en los comentarios que hay una manera mucho mejor de manejar nuestras referencias variables.

Arguments are space-separated in the bash shell, it will tokenize when there is a space in the resulted expanded command. In your script,

cp $1 $2.$date_formatted

funcionará según lo previsto siempre y cuando las variables expandidas no tengan espacios en ellas. Si llamas a tu script de esta manera:

datecp 'my old name' 'my new name'

la expansión dará como resultado este comando:

cp my new name my old name.the_date

que en realidad tiene 6 argumentos.

Para abordar adecuadamente este problema, la última línea del script debe ser:

cp '$1' '$2.$date_formatted'

Como puedes ver, cambiando la línea de nuestro script desde:

cp -iv $1 $2.$date_formatted

a:

cp -iv “$1” “$2”.$date_formatted

se ocupará de este problema cuando use el script en archivos que tengan espacios en el nombre. Samuel también señala que cuando copie y pegue el código de este sitio (o de Internet en general) asegúrese de sustituir los guiones y citas correctos por los "tipográficamente mejores" que a menudo los reemplazan. También haremos más para asegurarnos de que nuestro código sea más fácil de copiar / pegar.;-)

Otro comentarista, Myles Braithwaite, decidió expandir nuestro script para que la fecha apareciera antes de la extensión del archivo. Así que en lugar de

tastyfile.mp3.07_14_11-12.34.56

obtendríamos esto:

tastyfile.07_14_11-12.34.56.mp3

que termina siendo un poco más conveniente para la mayoría de los usuarios. Su código está disponible en su página de GitHub. Echemos un vistazo a lo que usa para separar el nombre del archivo.

date_formatted=$(date +%Y-%m-%d_%H.%M%S) file_extension=$(echo “$1″|awk -F. ‘{print $NF}’) file_name=$(basename $1.$file_extension)

cp -iv $1 $file_name-$date_formatted.$file_extension

He cambiado un poco el formato, pero puedes ver que Myles declara su función de fecha en la Línea 1. Sin embargo, en la Línea 2 usa el comando "echo" con el primer argumento del script para mostrar el nombre del archivo. Él usa el comando pipe para tomar esa salida y usarla como entrada para la siguiente parte. Después de la tubería, Myles invoca el comando "awk", que es un potente programa de exploración de patrones. Usando el indicador -F, le está diciendo al comando que el siguiente carácter (después de un espacio) es lo que definirá el "separador de campo". En este caso, eso es un período.

Ahora, awk ver un archivo llamado "tastyfile.mp3" como compuesto de dos campos: "tastyfile" y "mp3". Por último, utiliza

‘{print $NF}’

para visualizar el último campo. En caso de que su archivo tenga varios períodos (por lo tanto, hacer que awk vea múltiples campos) solo mostrará el último, que es la extensión del archivo.

En la línea 3, crea una nueva variable para el nombre del archivo y usa el comando "basename" para hacer referencia a todo en $ 1 excepto la extensión de archivo. Esto se hace usando basename y dándole $ 1 como argumento, luego agregando un espacio y la extensión del archivo. La extensión del archivo se agrega automáticamente debido a la variable que hace referencia a la Línea 2. Lo que esto haría es tomar

tastyfile.mp3

y convertirlo en

tastyfile

Luego, en la última línea, Myles juntó el comando que generará todo en orden. Tenga en cuenta que no hay referencia a $ 2, un segundo argumento para el script. Este script en particular copiará dicho archivo en su directorio actual en su lugar. Gran trabajo Samuel y Myles!

Ejecutando Scripts y $ PATH

También mencionamos en nuestro artículo de Conceptos básicos que los scripts no pueden ser referenciados como comandos de forma predeterminada. Es decir, debes apuntar a la ruta del script para ejecutarlo:

./script

~/bin/script

Pero, al colocar sus scripts en ~ / bin /, podría escribir sus nombres desde cualquier lugar para que se ejecuten.

Los comentaristas dedicaron un tiempo a debatir qué tan apropiado era esto, ya que ninguna distribución moderna de Linux crea ese directorio por defecto. Además, nadie lo agrega a la variable $ PATH de forma predeterminada, que es lo que se requiere para que los scripts se ejecuten como comandos. Estaba un poco desconcertado porque después de verificar mi variable $ PATH, los comentaristas tenían razón, pero las secuencias de comandos de llamada aún funcionaban para mí. Descubrí por qué: muchas distribuciones modernas de Linux crean un archivo especial en el directorio de inicio del usuario:.profile.

Image
Image

Este archivo se lee con bash (a menos que.bash_profile esté presente en el directorio de inicio del usuario) y en la parte inferior, hay una sección que agrega la carpeta ~ / bin / a la variable $ PATH si existe. Entonces, ese misterio se aclara. Para el resto de la serie, continuaré colocando scripts en el directorio ~ / bin / porque son scripts de usuario y los usuarios deberían poder ejecutarlos. Y, al parecer, realmente no necesitamos alterar la variable $ PATH a mano para que las cosas funcionen.

Repitiendo comandos con bucles

Vayamos a una de las herramientas más útiles en el arsenal geek para tratar tareas repetitivas: los bucles. Hoy vamos a discutir los bucles "for".

El esquema básico de un for-loop es el siguiente:

for VARIABLE in LIST; do command1 command2 … commandn done

VARIABLE puede ser cualquier variable, aunque la mayoría de las veces se utiliza la “i” minúscula por convención. LISTA es una lista de artículos; puede especificar varios elementos (separándolos por un espacio), apuntar a un archivo de texto externo o usar un asterisco (*) para indicar cualquier archivo en el directorio actual. Los comandos enumerados están sangrados por convención, por lo que es más fácil ver el anidamiento: colocar bucles en bucles (para que pueda hacer bucles mientras realiza un bucle).

Debido a que las listas usan espacios como delimitadores, es decir, un espacio significa un movimiento al siguiente elemento de la lista, los archivos que tienen espacios en el nombre no son muy amigables. Por ahora, sigamos trabajando con archivos sin espacios. Comencemos con un simple script para mostrar los nombres de los archivos en el directorio actual. Cree un nuevo script en su carpeta ~ / bin / titulado "loopscript". Si no recuerdas cómo hacer esto (incluyendo marcarlo como ejecutable y agregar el hack de hash bang), consulta nuestro artículo de conceptos básicos de scripts de bash.

En ella, ingresa el siguiente código:

for i in item1 item2 item3 item4 item5 item6; do echo “$i” done

Cuando ejecute el script, debería obtener esos elementos de la lista como salida.
Cuando ejecute el script, debería obtener esos elementos de la lista como salida.
Bastante simple, ¿verdad? Vamos a ver qué pasa si cambiamos las cosas un poco. Cambia tu guión para que diga esto:
Bastante simple, ¿verdad? Vamos a ver qué pasa si cambiamos las cosas un poco. Cambia tu guión para que diga esto:

for i in *; do echo “$i” done

Cuando ejecute este script en una carpeta, debe obtener una lista de los archivos que contiene como salida.
Cuando ejecute este script en una carpeta, debe obtener una lista de los archivos que contiene como salida.
Ahora, cambiemos el comando echo a algo más útil, por ejemplo, el comando zip. Es decir, agregaremos archivos a un archivo. Y, vamos a tener algunos argumentos en la mezcla!
Ahora, cambiemos el comando echo a algo más útil, por ejemplo, el comando zip. Es decir, agregaremos archivos a un archivo. Y, vamos a tener algunos argumentos en la mezcla!

for i in $@; do zip archive “$i” done

¡Hay algo nuevo! “$ @” Es un atajo para “$ 1 $ 2 $ 3… $ n”. En otras palabras, es la lista completa de todos los argumentos que especificó. Ahora, observe lo que sucede cuando ejecuto el script con varios archivos de entrada.
¡Hay algo nuevo! “$ @” Es un atajo para “$ 1 $ 2 $ 3… $ n”. En otras palabras, es la lista completa de todos los argumentos que especificó. Ahora, observe lo que sucede cuando ejecuto el script con varios archivos de entrada.
Puedes ver qué archivos están en mi carpeta. Ejecuté el comando con seis argumentos, y cada archivo se agregó a un archivo comprimido llamado "archive.zip". Fácil, ¿verdad?
Puedes ver qué archivos están en mi carpeta. Ejecuté el comando con seis argumentos, y cada archivo se agregó a un archivo comprimido llamado "archive.zip". Fácil, ¿verdad?

Porque los bucles son bastante maravillosos. Ahora puedes ejecutar funciones por lotes en listas de archivos. Por ejemplo, puede copiar todos los argumentos de su script en un archivo comprimido comprimido, mover los originales a una carpeta diferente y proteger de forma automática la copia de ese archivo zip en una computadora remota. Si configura archivos clave con SSH, ni siquiera tendrá que ingresar su contraseña, e incluso puede decirle al script que elimine el archivo zip después de cargarlo.

El uso de for-loops facilita la realización de un montón de acciones para todos los archivos en un directorio. Puede apilar una amplia variedad de comandos y usar argumentos muy fácilmente para crear una lista sobre la marcha, y esto es solo la punta del iceberg.

Bash scripters, ¿tienes alguna sugerencia? ¿Has hecho un script útil que usa bucles? ¿Quieres compartir tus pensamientos sobre la serie? ¡Deja algunos comentarios y ayuda a otros novatos en scripting!

Recomendado: