Linux es popular entre los desarrolladores y en el mundo de la informática por su capacidad para proporcionar la funcionalidad de terminal/interfaz de línea de comandos (CLI). A través de CLI, un usuario puede ejecutar comandos para realizar las tareas deseadas. Bash, a menudo denominado indistintamente como shell, es un lenguaje de secuencias de comandos popular en el que se puede ejecutar un conjunto de comandos a través de CLI.
Bash ofrece muchas formas de aceptar entradas (tantas como uno quiera) del usuario, como argumentos de línea de comandos, basados en requests, etc. A menudo , argumentos de línea de comandoslas entradas son más rápidas en el procesamiento ya que se proporcionan antes del inicio de la ejecución del script. Las entradas basadas en requests se recopilan dinámicamente del usuario si son necesarias. En nuestra declaración del problema, estamos seguros de que obtendríamos los elementos de entrada, por lo que seguiremos adelante y asumiremos que estos elementos se recopilan como argumentos de línea de comandos.
Un delimitador es uno en un lenguaje simple que se puede explicar como un separador que, según alguna lógica comercial, separa los elementos. Aquí, en el enunciado del problema, considere dos puntos (:) como un delimitador. Todos estamos familiarizados con los delimitadores, ya que nos habríamos encontrado con archivos .csv (valores separados por comas) en los que la coma (,) actúa como delimitador. Por lo tanto, separar o analizar las entradas en función del delimitador suele ser el primer paso de cualquier procesamiento de lógica de negocios, por lo que la siguiente declaración del problema y su solución tendrán una variada gama de aplicaciones en scripting de bash.
Declaración del problema: para el elemento de entrada dado, separe los elementos usando el delimitador como dos puntos. Los siguientes son varios casos de uso para el mismo,
Entrada de muestra:
CASE 1: Simple input items separated by colon. Example: First Names/Words separated by Colon. ./Colon.sh Geek:For:Geeks:Good CASE 2: Special Characters inclusive input like "@!"£$%." etc. Example: Email Addresses separated by colon ./Colon.sh "abc@gmail.com:xyz@gmail.com:Exclamation!" CASE 3: Space is included in the input items/words. Example: Full Names Separated by Colons ./Colon.sh "Geeks for Geeks is good: Open Source Community: Great Contributions" CASE 4: Space as well as Quotes are Included in the Input Item. Example: Combination of case 2 and 3. ./Colon.sh 'Geeks "ForGeeks":Amazingly "Awesome":Detailed "Examples"'
Acercarse:
- Utilice el comando de corte para la separación basada en delimitadores de los elementos de entrada dados con la ayuda de un bucle while para atravesarlos.
- Inicialmente, defina una variable de campo (manteniendo el nombre de la variable como un campo porque el comando de corte tiene la opción -f que se usa en el script que a su vez significa número de campo ) y configúrelo en 1 ya que comenzamos desde el primero artículo.
- Inicie el ciclo while que se usará para recorrer los elementos de entrada dados individualmente.
- Luego haga eco de los elementos de entrada y canalícelos ( | ) a través del comando de corte que actúa como entrada para el comando de corte y usando un delimitador (-d) y un número de campo (-f) la opción de cortar cada elemento se imprime en función del número de campo separados por delimitador como dos puntos ( : ).
- Después de imprimir cada elemento de entrada, incremente la variable de campo para procesar/imprimir el siguiente elemento.
- Hay una declaración condicional para verificar si el elemento del campo th está vacío (lo que a su vez significa que todos los elementos de entrada se procesan/separan e imprimen correctamente) si está vacío, el ciclo while y el script de shell se cierran con éxito; de lo contrario, continúe con la impresión de entrada el elemento actual y la variable de campo incremental hasta que se procesen todos los elementos de entrada.
Shell Script: El siguiente es el Shell Script (Colon.sh) que procesa el primer argumento como la lista dada de elementos y los separa en función de los dos puntos «:» como delimitador.
#! /bin/bash # Set initial field for cut to 1 field=1 # Using while loop to traverse through input items while [ 1 ] do # Printing each item s=`echo $1 | cut -d ":" -f $field` # Condition to check if Input is processed, Quotes are # essential for processing special characters in the input if [ ! "$s" ] then # if input processing is finished then exit else continue exit else # Print each item/word from input echo $s # Incrementing field after each word being processed. field=`expr $field + 1` fi done
Producción:
Explicación:
CASE 1: ./Colon.sh Geek:For:Geeks:Good Geek For Geeks Good
La entrada anterior es un caso simple de palabras sencillas (solo están presentes los caracteres AZ y az), por lo que no hay caracteres especiales ni espacios incluidos en la entrada, por lo tanto, incluso si no se usan comillas alrededor de los elementos de entrada, está bien como script considerará la lista completa de elementos como 1 argumento de línea de comandos y la procesará como se esperaba. Entonces, Geek:For:Geeks:Good simplemente se procesa para separar las palabras (un ejemplo práctico podría ser el nombre) y se imprime como salida (como se ve en la captura de pantalla de la Figura 1).
CASE 2: ./Colon.sh "abc@gmail.com:xyz@gmail.com:Exclamation!" abc@gmail.com xyz@gmail.com Exclamation!
En el caso anterior, los caracteres especiales como “@, ‘ “, etc. se consideran en la entrada. Para que el script comprenda correctamente la entrada, cubra los elementos de entrada entre comillas dobles (» « ). También en la verificación de finalización de entrada en el script ( si [! «$s»] ) rodeamos la verificación con comillas para un análisis adecuado. Por lo tanto, para la entrada » abc@gmail.com:xyz@gmail.com:Exclamation!» los elementos de entrada separados correctamente se obtienen usando el delimitador como dos puntos (:) como se ve en la captura de pantalla Figura 1.
CASE 3: ./Colon.sh "Geeks for Geeks is good: Open Source Community: Great Contributions" Geeks for Geeks is good Open Source Community Great Contributions
En el caso anterior, el espacio es un carácter válido para un elemento de entrada determinado. Ahora, el problema aquí Bash asume que los argumentos de la línea de comandos están separados por espacios, por lo que en este caso de elementos de entrada asumirá que “ Geeks es el primer argumento de la línea de comandos, For es el 2 ° , Geeks es el 3 ° y así sucesivamente. Para evitar este problema, rodee la entrada con comillas dobles (“ “ ). Entonces, ahora la entrada citada se convierte en solo 1 argumento de línea de comando y se procesa como deseábamos, la entrada que es » Geeks for Geeks is good: Open Source Community: Great Contributions» que se puede asumir como nombres completos de personas separados usando dos puntos ( :) como delimitador, como se ve en la captura de pantalla de la Figura 1.
CASE 4: ./Colon.sh 'Geeks "ForGeeks":Amazingly "Awesome":Detailed "Examples"' Geeks "ForGeeks" Amazingly "Awesome" Detailed "Examples"
En el caso anterior, ahora digamos que las comillas dobles (» « ) se consideran un carácter válido para los elementos de entrada en sí, para procesar el cambio del entorno de los elementos de entrada con comillas simples ( ‘ ‘ ) para un análisis exitoso. Entonces, la entrada anterior ‘Geeks «ForGeeks»: Sorprendentemente «Impresionante»: «Ejemplos» detallados’, que se puede considerar como un ejemplo de oraciones con adjetivos entre comillas, dado como entrada y se procesará como se desee para dar el delimitador Dos puntos ( : ) basado en salida separada como se ve en la Figura 1.
Por lo tanto, este simple script de shell separa los elementos de entrada dados usando dos puntos (:) como delimitador tiene una amplia gama de aplicaciones y puede modificarse ligeramente para cambiar cualquier delimitador deseado como coma (,), punto y coma (;), etc.
Publicación traducida automáticamente
Artículo escrito por shreyasangchekar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA