Mejores prácticas de secuencias de comandos de Shell de Linux
IT Roadside Club
Prólogo
Al igual que otros estándares de codificación, lo que se analiza aquí no es solo la belleza del formato de codificación, sino también la discusión sobre algunas convenciones. y estándares de codificación. Este documento se centra principalmente en las reglas que generalmente seguimos y tratamos de evitar brindar opiniones sobre aquellas que no son obligatorias explícitamente.
Las convenciones de codificación son particularmente importantes para los programadores por varias razones:
Las pautas de este documento se esfuerzan por maximizar los siguientes principios:
Aunque este documento cubre muchos conceptos básicos Cabe señalar que ninguna especificación de codificación puede responder todas las preguntas por nosotros, y los desarrolladores siempre deberán tomar buenas decisiones sobre los principios anteriores después de escribir el código.
Nota: Si no se especifica explícitamente, el valor predeterminado es Obligatorio.
Consulte principalmente los siguientes documentos:
Solo se recomienda utilizar Shell como relativamente utilidad simple o script contenedor. Por lo tanto, el contenido de un único script de shell no debería ser demasiado complejo.
Se deben seguir los siguientes principios al elegir cuándo usar scripts de shell:
No se recomienda que los archivos ejecutables tengan extensiones. Los archivos de la biblioteca deben usar .sh como extensión y no deben. ser ejecutado.
A la hora de ejecutar un programa, no es necesario conocer el idioma en el que está escrito, y los scripts de shell no requieren extensiones, por lo que es preferible que los archivos ejecutables no tengan extensiones.
Es muy importante que los archivos de la biblioteca conozcan el idioma en el que están escritos. El uso de .sh como extensión de un sufijo de idioma específico se puede distinguir de los archivos de la biblioteca escritos en otros idiomas.
El nombre del archivo debe estar todo en minúsculas y puede contener guiones bajos _ o guiones -. Se recomienda utilizar guiones para archivos ejecutables y guiones bajos para archivos de biblioteca.
Ejemplo positivo:
Ejemplo negativo:
El formato de codificación del archivo fuente es UTF-8. Para evitar que diferentes sistemas operativos manejen los saltos de línea de archivos de diferentes maneras, utilice siempre LF.
Cada línea no puede exceder los 120 caracteres. La razón fundamental para el límite de longitud máxima para cada línea de código es que las líneas demasiado largas causarán dificultades de lectura y harán que la sangría sea ineficaz.
Excepto en las dos situaciones siguientes:
Si hay una cadena que debe tener más de 120 caracteres, debe intentar utilizar métodos adecuados, como aquí documento o saltos de línea incrustados para cámbielo.
Ejemplo:
Además de utilizar un carácter de nueva línea al final de una línea, un espacio es el único carácter de espacio en blanco permitido en un archivo fuente.
Limpie resueltamente los métodos y variables que nunca se hayan utilizado o que estén comentados del código para evitar interferencias causadas por exceso de basura.
Bash es el único shell de script ejecutable permitido.
Los archivos ejecutables deben comenzar con #!/bin/bash.
Utilice set para configurar las opciones de shell para que bash echo "Proceso $: Hecho de hacer $$$."
# Ejemplo 7: Los parámetros y rutas del comando no necesitan comillas grep -li Hugo /dev/ " $1 "
# Ejemplo 8: Utilice comillas dobles para variables regulares. En casos especiales en los que ccs pueda estar vacío, no se necesitan comillas. git send-email --to "${reviewers}" ${ccs: +"-- cc" "${ccs}"}
# Ejemplo 9: Usar comillas simples para expresiones regulares En casos especiales donde $1 puede estar vacío, no se necesitan comillas grep -cP '([ Ss]pecial||?characters*) ${1:+"$1"}
# Ejemplo 10: se recomienda utilizar "$@" entre comillas para pasar parámetros posicionales, y se deben pasar todos los parámetros como una sola cadena usando "$*" # contenido de t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t " $*" # Al ejecutar ./t.sh a b c La salida es la siguiente: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
Utilice $(comando) en lugar de comillas invertidas.
Debido a que las comillas invertidas deben estar anidadas, las comillas invertidas internas deben ir acompañadas de barras invertidas. El anidamiento en forma de $(comando) no requiere escape y es más legible.
Ejemplo positivo:
Contraejemplo:
Prueba condicional
Utilice [[ ... ]] en lugar de [ , prueba y /usr/bin/[.
El uso de [[... ]] reduce los errores porque no se produce ninguna expansión de ruta ni división de palabras entre [[ y ]]. Y [[ ... ]] admite la coincidencia de expresiones regulares, mientras que [ ... ] no. Considere los siguientes ejemplos:
Utilice referencias de variables en lugar de filtrado de cadenas siempre que sea posible.
Bash puede manejar muy bien las pruebas de cadenas vacías. Utilice el método de prueba de cadenas vacías/no vacías en lugar de filtrar caracteres para que el código sea más legible. Ejemplo positivo:
Contraejemplo:
Ejemplo positivo:
Contraejemplo:
Ejemplo positivo:
Contraejemplo:
Expansión de nombres de archivos
Al realizar la expansión con comodines de los nombres de archivos, especifique una ruta explícita.
Cuando hay nombres de archivos especiales en el directorio, como archivos que comienzan con -, es mucho más seguro utilizar el carácter comodín extendido ./* con una ruta que * sin una ruta.
Se debe evitar el uso de eval.
Eval modifica el contenido de entrada cuando se usa para asignar variables, pero no verifica cuáles son esas variables al configurarlas. Contraejemplo:
Utilice la sustitución de procesos o el bucle for en lugar de conectarse al bucle while a través de la tubería.
Esto se debe a que en el bucle while después de la canalización, el comando se ejecuta en un subshell, por lo que las modificaciones a las variables no se pueden pasar al shell principal.
Este tipo de canalización conecta el subshell implícito en el bucle while, lo que dificulta mucho la localización de errores. Ejemplo de contador:
Si está seguro de que la entrada no contiene espacios u otros caracteres especiales (normalmente no procedentes de la entrada del usuario), puede utilizar un bucle for en su lugar. Por ejemplo:
Utilice la sustitución de procesos para redirigir la salida, pero coloque el comando en un subshell explícito, no en el subshell implícito creado por un bucle while.
Por ejemplo:
Compruebe siempre el valor de retorno y proporcione un valor de retorno útil.
Para comandos que no son de canalización, use $? o verifique directamente mediante una declaración if para hacerlo simple.
Por ejemplo:
Cuando los comandos integrados pueden realizar la misma tarea, debe intentar elegir comandos integrados entre los comandos integrados del shell y llamar a comandos externos.
Porque los comandos integrados tienen menos dependencias que los comandos externos y, en la mayoría de los casos, llamar a comandos integrados puede lograr un mejor rendimiento que llamar a comandos externos (normalmente los comandos externos generarán una sobrecarga de procesos adicionales).
Ejemplo positivo:
Contraejemplo:
No se recomienda utilizar . para cargar archivos de biblioteca externos. Se recomienda utilizar código fuente, que ha mejorado la legibilidad. . Ejemplo positivo:
Contraejemplo:
A menos que sea necesario, intente utilizar un solo comando y su combinación de parámetros para completar una tarea, en lugar de una combinación innecesaria de múltiples comandos y canalizaciones. Los usos comunes que no se recomiendan incluyen: cat y grep se usan juntos para filtrar cadenas; cat y wc se usan juntos para contar el número de líneas; grep y wc se usan juntos para contar el número de líneas, etc.
Ejemplo positivo:
Excepto en circunstancias especiales, casi todas las funciones no deben usar exit para salir del script directamente, sino que deben usar return para regresar para que los errores puedan manejarse en la lógica posterior. . Ejemplo positivo:
Contraejemplo:
Recomendamos las siguientes herramientas para ayudarnos a estandarizar el código:
Enlace original: http://itxx00.github.io /blog /2020/01/03/shell-standards/
Para obtener más preguntas de entrevistas, guiones y otra información de operación y mantenimiento, haga clic en: Obtener de la comunidad de conocimientos de operación y mantenimiento
Script---SMS Bomber
Script---QQ WeChat Bomber
ansible---construya un clúster redis5.0.5 con un clic
elk7. 9 documento real de implementación de Docker en clúster
El documento de implementación y configuración de Loki más completo del mundo
El script de refuerzo de seguridad 2.0 más potente
Configuración con un solo clic del script iptbales