¿Hay alguna ventaja / desventaja de inicializar el valor de una variable bash en el script, ya sea antes del código principal o variables locales en una función antes de asignarle el valor real?
¿Necesito hacer algo como esto:
init()
{
name=""
name=$1
}
init "Mark"
¿Existe algún riesgo de que las variables se inicialicen con valores basura (si no se inicializan) y que tengan un efecto negativo en los valores de las variables?
name = ""; name = argv[1];
? ¿Y no es eso tan inútil?Respuestas:
No es beneficioso asignar una cadena vacía a una variable y luego asignarle inmediatamente otra cadena variable. Una asignación de un valor a una variable de shell sobrescribirá por completo su valor anterior.
Que yo sepa, no hay ninguna recomendación que diga que debe inicializar explícitamente las variables en cadenas vacías. De hecho, hacerlo puede enmascarar errores en algunas circunstancias (errores que de otro modo serían evidentes si se ejecutan bajo
set -u
, ver más abajo).Una variable no establecida, que no se utiliza desde el inicio de un script o que se desarma explícitamente al ejecutar el
unset
comando en ella, no tendrá valor. El valor de tal variable será nada. Si se usa como"$myvariable"
, obtendrá el equivalente de""
, y nunca obtendrá "datos basura".Si la opción de shell
nounset
se establece con unoset -o nounset
oset -u
, entonces hacer referencia a una variable no establecida hará que el shell produzca un error (y un shell no interactivo terminaría):o en
bash
:Las variables de shell serán inicializadas por el entorno si el nombre de la variable corresponde a una variable de entorno existente.
Si espera que esté utilizando una variable que puede ser inicializada por el entorno de esta manera (y si no es deseada), puede desarmarla explícitamente antes de la parte principal de su script:
lo que también lo eliminaría como una variable de entorno, o simplemente puede ignorar su valor inicial y simplemente sobrescribirlo con una asignación (lo que haría que la variable de entorno cambie también el valor).
Nunca encontraría basura no inicializada en una variable de shell (a menos que, como se indicó, esa basura ya existiera en una variable de entorno con el mismo nombre).
fuente
unset
ting) antes de ejecutar algún tipo defor
owhile
bucle para establecer en un calculado valor si hay alguna posibilidad de que el bucle no se ejecute realmente debido a que no se cumplen las condiciones; y la variable podría haberse establecido en algún otro valor en el entorno que el script heredó. Pero podría decirse que es mejor poner todo enmain()
ay definir las variables comolocal
.:
, por ejemplo${myvariable-defaultvalue}
Editar : Vaya, aparentemente la declaración es diferente de la inicialización. Lo dejaré aquí de todos modos para que los programadores novatos como yo puedan aprender de mi error.
La ventaja de declarar variables locales en una función es que puede copiar fácilmente el código.
Por ejemplo, digamos que tengo una función:
Si quiero convertirlo en un script, simplemente ignoro la
local
declaración y copio todo lo demás:Si la declaración y la asignación estuvieran en la misma línea, tendría que editar manualmente la
local
parte antes de poder convertirla en un script:En este ejemplo, no es un gran problema, pero si se trata de funciones más grandes y complejas, puede ser más doloroso.
fuente