No puedo usar -
variables en shell. ¿Hay alguna manera de poder usarlo, porque tengo un script que depende de tales variables nombradas:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Primero arroja el error dado y el segundo funciona bien.
Respuestas:
Nunca he conocido un shell de estilo Bourne que permita
-
un nombre variable. Solo_
se admiten letras ASCII (de cualquier caso) y dígitos, y el primer carácter no debe ser un dígito.Si tiene un programa que requiere una variable de entorno que no coincide con las restricciones de shell, ejecútelo con el
env
programa.Tenga en cuenta que algunos shells (por ejemplo , guiones modernos , mksh, zsh) eliminan del entorno las variables cuyo nombre no les gusta. ( Shellshock ha provocado que las personas sean más cautelosas con los nombres de variables de entorno, por lo que es probable que las restricciones se vuelvan más estrictas con el tiempo, no más permisivas). Entonces, si necesita pasar una variable cuyo nombre contiene caracteres especiales a un programa, páselo directamente, sin un caparazón intermedio (
env 'strange-name=some value' sh -c'…; myprogram'
puede o no funcionar).fuente
env
Se utiliza en el sistema operativo.)env
desdecoreutils
,sh
desdedash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
funciona peroenv 'with-dashes=value' sh -c 'env | fgrep dashes'
no imprime nada. Es decir,env
sí está bien, pero Dash parece bloquear específicamente estas variables. Por lo tanto, si el programa en cuestión se inicia a través de un contenedor de shell con un#!/bin/sh
encabezado típico , no hay forma aparente de pasar esas variables. ejemplo de soluciónenv
más cerca del sitio de llamada del programa que necesita este nombre de variable, sin un shell intermedio. Dash no está solo en la eliminación de variables cuyo nombre no le gusta.Eso no es posible en Bash.
Desde la sección Definiciones en la página del manual de
bash
:Desde la sección Parámetros en la página del manual de
bash
:fuente
Puede acceder a una variable con guión utilizando una referencia indirecta.
fuente
Si su script depende de que los nombres de las variables tengan guiones, es un error de programación. Si es conveniente para usted debido a las herramientas que usa regularmente para que los nombres de las variables contengan un guión, es posible que deba aprender más y diferentes herramientas.
¿Has intentado usar tr para convertir los guiones en guiones bajos?
Bash permite que aparezca '-' en los nombres de las funciones. Hago esto todo el tiempo. Por ejemplo:
fuente
El carácter guión (
-
) es un carácter de corte y no está permitido como parte de los nombres de variables. Hay formas de hackear esto con variables citadas, pero su análisis es realmente problemático. También hay otros caracteres con significados especiales en el contexto de nombres de variables en bash, especialmente llaves, paréntesis, caracteres de operador y comillas. (p. ej.{}()=+-&'"
y más)Sugeriría que prácticamente necesita encontrar otro paradigma sobre el cual construir su script. Es posible que tenga una idea de otros idiomas sobre "nombres de variables variables". Esto generalmente no es una buena idea en los scripts de shell.
Si edita esto o hace una nueva pregunta con detalles de su contexto y lo que está tratando de lograr, podríamos sugerirle una buena forma de escribirlo.
fuente
El manual de Bash define un "nombre" como:
Entonces no puedes usar un guión en un nombre.
fuente
La mayoría de los shells solo admiten az, AZ, 0-9 y _ para nombres de variables. Lea el segundo elemento en esta página .
fuente
Puedes jugar con env y sed.
Como ejemplo, necesitaba leer esta variable 'ELASTICSEARCH_CLUSTER-NODES'.
El comando env genera esto:
Entonces para extraer la variable:
fuente
Creo que solo se permiten letras, números y guiones bajos para las variables bash. Este es el caso en muchos lenguajes de programación (javascript es una excepción).
Recomiendo que su script no dependa de esos tipos de nombres de variables.
De hecho, debe intentar programar de tal manera que pueda reemplazar los nombres de las variables con otros nombres y eso no hace la diferencia. En general, los nombres de las variables deben describir lo que contiene la variable. Esto facilita mucho la depuración; si no es por ti, entonces por el próximo desarrollador que está tratando de descifrar el código.
fuente
Puede usar el
env
comando para establecer y desarmar variables de entorno con guiones "-".Para configurar debe utilizar env para ejecutar su comando:
env command
. Pasas variables de esta manera:Véalo trabajando con:
o para hacerlo más claro:
fuente