Correcto de análisis variable y citando en Bash

Correcto de análisis variable y citando en Bash

Cotización incorrecta en el código fuente original puede conducir fácilmente a errores cuando la entrada proporcionada por los usuarios no es como se esperaba o no uniforme. Con el tiempo, cuando cambian los scripts de Bash, un efecto secundario imprevisto de una variable citada incorrectamente puede conducir a un error incluso en un código de otra manera intacto. Esto es aún más importante para las aplicaciones relacionadas con la seguridad que pueden ser propensas a los intentos de piratería. Aprenda cómo realizar cotizaciones y análisis/validación variables desde el principio, y evite muchos de estos problemas! Empecemos…

En esta serie tutorial aprenderás:

  • Cómo citar sus variables de Bash correctamente
  • Las advertencias y resultados de cotizaciones incorrectas
  • Cómo garantizar que los valores variables sean lo que se supone que deben ser
  • Cómo verificar los valores variables vacíos, numéricos y basados ​​en texto
Correcto de análisis variable y citando en Bash

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución de Linux
Software Línea de comando bash, sistema basado en Linux
Otro Cualquier utilidad que no esté incluida en el shell bash de forma predeterminada se puede instalar utilizando sudo apt-get instalación de utilidad de utilidad (o yum en lugar de apt-get)
Convenciones # - requiere que los comandos de Linux se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux se ejecuten como un usuario regular no privilegiado

Ejemplo 1: cita esas variables!

A menos que esté trabajando con valores numéricos, e incluso en ese caso a veces, es aconsejable citar siempre sus variables basadas en texto al verificar la igualdad, etc. Veamos un ejemplo:

$ Var1 = "a"; if [$ var1 == "a"]; Entonces hacer eco de sí!'; Fi si! $ Var1 =; if [$ var1 == "a"]; Entonces hacer eco de sí!'; FI Bash: [: ==: esperado el operador unario 


Primero nos pusimos Var1 al valor a y posteriormente comprobado si Var1 igualado a. Que funcionó, y podemos pensar que nuestro código está bien y dejarlo como está dentro de nuestro script. Sin embargo, algún tiempo después y después de muchos cambios de código, comenzamos a ver Bash: [: ==: Se espera un operador unario - Un mensaje algo críptico que nos dice que hay algo mal con nuestro código.

La razón se muestra en el segundo ejemplo. Si de alguna manera nuestra variable está vacía, yo.mi. no ha podido establecerse correctamente (o se ha borrado desde la configuración), luego se nos presentará un error a medida que Bash le lee efectivamente a esto; Si [== "A"] que es una declaración que no tiene mucho sentido, y no puede calcular.

Si citamos correctamente nuestra variable con cotizaciones dobles ("), esto no sucedería:

$ Var1 =; if ["$ var1" == "a"]; Entonces hacer eco de sí!'; fi $ 

Esta vez, Bash leyó la declaración como Si ["" == "A"] - Una declaración más fácil para los ojos y el compilador de bash. No se genera salida como claramente una cadena vacía no es igual a la letra a.

Ejemplo 2: Tomar citas un poco más

Una vez que haya estado trabajando con Bash por un tiempo, aprenderá algunos de sus idiomas de lenguaje. Uno de esos idiomas es el - llamémoslo privilegio (y seguramente es una conveniencia!) - para poder citar variables numéricas incluso si se está ejecutando una operación numérica:

$ Var1 = 13; if ["$ var1" -eq 13]; Entonces hacer eco de sí!'; Fi si! $ Var1 = 7; if ["$ var1" -eq 13]; Entonces hacer eco de sí!'; FI 

Aunque VAR1 se establece en un valor numérico, Bash aceptará el " citar alrededor de VAR1 y producir correctamente el resultado de la instrucción IF utilizando el es igual (i.mi. -ecualización) Operación de comparación.

Sin embargo, aún no hemos alcanzado el círculo completo, ya que lo siguiente todavía falla;

$ Var1 =; if ["$ var1" -eq 13]; Entonces hacer eco de sí!'; FI Bash: [:: Expresión de entero esperado 

Esta vez se espera una expresión entera, pero una variable vacía (i.mi. " fue aprobado), y esto ciertamente no es numérico. ¿Hay alguna forma de arreglar esto?? Seguro:

Ejemplo 3: verificación de longitud cero

$ Var1 =; if [-n "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; fi $ var1 = 13; if [-n "$ var1"]; entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; Fi si! 

Aquí usamos una verificación previa para ver si la variable no tiene una longitud de cero utilizando la declaración condicional -norte Lo que significa que la cadena no tiene una longitud de cero. Esto también podría cambiarse por lo contrario usando ! -z dónde -z medio la cadena tiene una longitud de cero y el ! niega lo mismo, yo.mi. invierte el resultado:

$ Var1 =; si [ ! -z "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; fi $ var1 = 13; si [ ! -z "$ var1"]; entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; Fi si! $ Var1 = 7; si [ ! -z "$ var1"]; entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; fi $ 


También agregamos el = 7 ejemplo aquí para mostrar cómo el si funciones de declaración correctamente. Siempre prueba tu si Declaraciones y condiciones en una variedad de situaciones, casos de uso y excepciones genéricas (valores malos, sin valor, valores impares, etc.) Si desea asegurarse de que su código esté libre de errores.

Ejemplo 4: un cheque casi completo

Todavía hay una deficiencia en el último ejemplo. Lo recogiste? Básicamente, si pasamos valores textuales a la cadena, o si La declaración todavía falla:

$ Var1 = "a"; si [ ! -z "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; FI Bash: [: A: Expresión de entero esperado 

Esto se puede superar usando una subshell, grep, y algunas expresiones regulares. Para obtener más información sobre expresiones regulares, consulte nuestros bash regexps para principiantes con ejemplos y avanzado bash regex con artículos de ejemplos. Para obtener más información sobre las subshells bash, consulte nuestras subshells de Linux para principiantes con ejemplos y subshells de Linux avanzados con artículos de ejemplos.

La sintaxis no es demasiado compleja:

$ Var1 = 7; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; fi $ var1 = 13; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; Fi si! $ Var1 = "a"; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; fi $ 

Excelente. Aquí verificamos el contenido de Var1 ser numérico usando un Grep -O (solo grep; yo.mi. Grep solo la parte coincidente por la cadena de búsqueda, que en este caso es una expresión regular). Seleccionamos cualquier carácter de número de 0-9 y esto una o más veces (como lo indica el \+ calificador para el [0-9] rango de selección). Entonces, intentamos igualar esto Grep solo parte texto contra la variable original. ¿Es lo mismo?? En caso afirmativo, entonces nuestra variable consta de solo números.

Cuando expandimos nuestro exterior si declaración un poco para incluir un demás cláusula que nos dirá si una variable no es numérica, y cuando intentamos pasar 'a' Como entrada, vemos que las diversas entradas se analizan correctamente;

$ Var1 = 7; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; de la otra variable de eco no numérica!'; fi $ var1 = 13; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; de la otra variable de eco no numérica!'; Fi si! $ Var1 = "a"; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; de la otra variable de eco no numérica!'; variable Fi no numérica! 


Así que ahora tenemos una línea perfecta para nuestro código, no? No ... todavía nos estamos perdiendo algo ... ¿Ves qué?

Ejemplo 5: un cheque completo

¿Viste el problema?? No hemos revisado una variable vacía todavía!

$ Var1 = "; if [" $ (echo "$ var1" | grep -o '[0-9] \+') "==" $ var1 "]; entonces if [" $ var1 "-eq 13]; entonces echo 'sí!'; fi; de la otra variable de eco no numérica!'; FI Bash: [:: Expresión de entero esperado 

Ay. Confío en que ya ves por qué menciono regularmente en mis artículos para ver siempre tus creaciones de código de una forma u otra. Claro, Bash se presta a secuencias de comandos rápidos y fáciles, pero si desea asegurarse de que las cosas continúen funcionando correctamente al cambiar sus scripts o agregar código adicional, querrá asegurarse de que sus pruebas, entradas y salidas estén limpias y claramente definidas. La solución es fácil:

$ Var1 = "; si [ ! -z "$ var1" -a "$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; Entonces si ["$ var1" -eq 13]; Entonces hacer eco de sí!'; fi; de la otra variable de eco no numérica!'; variable Fi no numérica! 

Aquí, usando el puño si Declaración, agregamos una condición adicional para la variable Var1 a no (!) ser una variable de longitud cero. Esto funciona bien dada la configuración actual como la segunda parte de la primera si la declaración aún puede proceder independientemente del contenido de Var1.

Conclusión

En este artículo, analizamos cómo citar correctamente y analizar/evaluar variables, y exploramos cuán complejo era escribir una pieza de verificación variable perfecta de código bash. Aprender a hacer estas cosas correctamente desde el principio limitará en gran medida la cantidad de posibles errores que se pueden introducir por accidente.

Disfrutar y citar doble esas variables! 🙂

Tutoriales de Linux relacionados:

  • Lista de las mejores herramientas de Kali Linux para pruebas de penetración y ..
  • Manejo de la entrada del usuario en scripts bash
  • Bucles anidados en guiones Bash
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Bash Regex avanzado con ejemplos
  • Tutorial de depuración de GDB para principiantes
  • Mastering Bash Script Loops
  • Variables de Bash especiales con ejemplos
  • Expresiones regulares de Python con ejemplos
  • Cómo usar subshells Bash dentro de declaraciones