2009-03-23 16 views
129

Me encuentro con muchos scripts de shell con variables en mayúsculas, y siempre he pensado que hay un malentendido grave con eso. Según tengo entendido, por convención (y quizás por necesidad hace mucho tiempo), las variables de entorno están en mayúsculas.Corregir bash y mayúsculas de variable de script shell

Pero en entornos de scripting modernos como Bash, siempre he preferido la convención de nombres de minúsculas para variables temporales, y los de mayúsculas solo para variables exportadas (es decir, entorno). Por ejemplo:

#!/usr/bin/env bash 
year=`date +%Y` 
echo "It is $year." 
export JAVA_HOME="$HOME/java" 

Eso siempre ha sido mi opinión sobre las cosas. ¿Hay alguna fuente autorizada que esté de acuerdo o en desacuerdo con este enfoque, o es puramente una cuestión de estilo?

Respuesta

177

Por convención, las variables de entorno (PAGER, EDITOR, ..) y variables de shell internos (SHELL, BASH_VERSION, ..) se capitalizan. Todos los demás nombres de variables deben estar en minúsculas.

Recuerde que los nombres de las variables distinguen entre mayúsculas y minúsculas; esta convención evita anular accidentalmente las variables ambientales e internas.

De acuerdo con esta convención, puede estar seguro de que no necesita conocer todas las variables de entorno utilizadas por las herramientas o los proyectiles UNIX para evitar sobrescribirlos. Si es tu variable, minúscala. Si lo exporta, en mayúscula.

+5

+1. Buen punto sobre la sobreescritura accidental.Olvidé mencionarlo, pero ahora que lo mencionas, creo que decidí usar minúsculas porque leí o escuché sobre ese problema. – JasonSmith

+3

Pensé que la razón principal para usar nombres de variables en mayúsculas era evitar conflictos con los comandos de la shell. Hace poco, el nombre de host de uno de nuestros servidores se cambió accidentalmente a '=' porque un script usaba una variable 'nombre de host'. – ThisSuitIsBlackNot

+17

@ThisSuitIsBlackNot Ignorando el código de mierda, las variables tienen como prefijo un dólar cuando se expanden y se usan en un lugar donde no se pueden confundir con un nombre de comando cuando no lo están. Obviamente, hacer hostname = moo te causará problemas. No porque esté utilizando un "nombre de host" en minúsculas, sino porque no está utilizando la sintaxis de asignación correcta. La tarea se realiza con hostname = moo, sin espacios. Suponiendo que el código es correcto, no tiene que preocuparse por nombres de variables que entren en conflicto con los nombres de los comandos. – lhunath

3

Es solo una convención muy extendida, dudo que haya una fuente "autorizada" para ello.

5

Hago lo que haces. Dudo que haya una fuente autorizada, pero parece ser un estándar de facto bastante extendido.

+0

estoy de acuerdo. Es porque ALL_CAPS es feo, pero es bueno hacer que ENVIRONMENT VARIABLES se destaque por ser feo. – slim

+0

Estoy de acuerdo con usted en el estilo de codificación, pero definitivamente estoy en desacuerdo con que está muy extendido. Los scripts de Shell son uno de esos idiomas secundarios que las personas aprenden de manera informal, por lo que siento que todo el mundo siempre dice LOCATION = 'cat/tmp/location.txt' – JasonSmith

+0

@jhs - Obviamente he tenido suerte en los guiones del intérprete de comandos. ¡Tuve que trabajar con! – Draemon

2

utilizo ALL_CAPS tanto para el entorno como para las variables globales. Por supuesto, en Bash no existe un alcance variable real, por lo que hay una buena porción de variables utilizadas como globales (principalmente configuraciones y seguimiento de estado) y relativamente pocos "locales" (contadores, iteradores, cadenas parcialmente construidas y temporales)

+0

Sí, como conceptualmente pienso en variables no exportadas como locales, ya que Bash a menudo está horcando procesos secundarios para hacer lo que se le ha encomendado. – JasonSmith

3

En realidad, el término "variables de entorno" parece ser de acuñación bastante reciente. Kernighan y Pike en su libro clásico "El entorno de programación UNIX", publicado en 1984, hablan solo de "variables de caparazón": ¡ni siquiera hay una entrada para "medio ambiente" en el índice!

+4

Creo que es una omisión del libro. getenv(), setenv() y environ se introdujeron en UNIX versión 7 (1979). http://en.wikipedia.org/wiki/Version_7_Unix – Juliano

+2

Ese libro parece notar que las variables mayúsculas tienen un significado especial. – ashawley

3

Todas las convenciones de nomenclatura seguidas siempre ayudarán. Aquí hay algunos consejos útiles para la cáscara variable de nombres:

  • Uso todas las tapas y subraya de variables y constantes exportados. Use un prefijo común siempre que corresponda para que las variables relacionadas se destaquen.

    Ejemplos:

    • variables exportadas con un prefijo común: JOB_HOMEJOB_LOGJOB_TEMPJOB_RUN_CONTROL
    • constantes: PIMAX_FILESOKERRORWARNING
  • Uso "Caso serpiente" (todo en minúsculas y subraya) para todas las variables que tienen un solo script o un bloque.

    Ejemplos: input_filefirst_valuemax_amountnum_errors

    caso mixto cuando la variable local tiene alguna relación con una variable de entorno, como: old_IFSold_HOME

  • Utilice un subrayado inicial para las variables "privadas" y funciones. Esto es especialmente relevante si alguna vez escribe una biblioteca de shell donde las funciones dentro de un archivo de biblioteca o entre archivos necesitan compartir variables, sin chocar con nada que pueda ser nombrado de manera similar en el código principal.

    Ejemplos: _debug_debug_level_current_log_file

  • Nunca use caso camello. Esto asegurará que no nos topemos con errores causados ​​por errores tipográficos. Recuerde, las variables de shell son sensibles a mayúsculas y minúsculas

    Ejemplos: inputArraythisLooksBAD, numRecordsProcessed, veryInconsistent_style


Ver también:

Cuestiones relacionadas