Eu não sou capaz de usar -
em variáveis no shell. Existe uma maneira de poder usá-lo, porque eu tenho um script que depende dessas variáveis nomeadas:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Primeiro lança o erro fornecido e o segundo funciona bem.
Respostas:
Eu nunca conheci um shell no estilo Bourne que permitia
-
um nome de variável. Apenas letras ASCII (dos dois casos)_
e dígitos são suportados, e o primeiro caractere não deve ser um dígito.Se você possui um programa que requer uma variável de ambiente que não corresponde às restrições do shell, inicie-o com o
env
programa.Observe que alguns shells (por exemplo , traço moderno , mksh, zsh) removem variáveis cujo nome não gostam do ambiente. (O Shellshock fez com que as pessoas fossem mais cautelosas em relação aos nomes de variáveis de ambiente; portanto, é provável que as restrições se tornem mais rígidas ao longo do tempo, não mais permissivas.) Portanto, se você precisar passar uma variável cujo nome contenha caracteres especiais para um programa, passe-a diretamente, sem uma concha no meio (
env 'strange-name=some value' sh -c'…; myprogram'
pode ou não funcionar).fonte
env
Você usou sobre o sistema operacional.)env
fromcoreutils
,sh
fromdash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
funciona, masenv 'with-dashes=value' sh -c 'env | fgrep dashes'
não imprime nada. Ou seja,env
ele é bom, mas o Dash parece bloquear especificamente essas variáveis. Portanto, se o programa em questão for iniciado por meio de um invólucro de shell com um#!/bin/sh
cabeçalho típico , não há uma maneira aparente de passar essas variáveis. solução alternativa de exemploenv
mais perto do site de chamada do programa que precisa desse nome de variável, sem um shell no meio. Dash não está sozinho na remoção de variáveis cujo nome não gosta.Isso não é possível no Bash.
Na seção Definições na página de manual de
bash
:De seção Parâmetros na página de manual de
bash
:fonte
Você pode acessar uma variável hifenizada usando uma referência indireta.
fonte
Se o seu script depende de nomes de variáveis com hífens, isso é um erro de programação. Se for conveniente para você, devido às ferramentas que você usa regularmente para que os nomes das variáveis contenham um hífen, talvez seja necessário aprender mais e diferentes ferramentas.
Você já tentou usar tr para converter os hífens em sublinhados?
O Bash permite que '-' apareça nos nomes das funções. Eu faço isso toda hora. Por exemplo:
fonte
O
-
caractere dash ( ) é um caractere de interrupção e não é permitido como parte dos nomes de variáveis. Existem maneiras de hackear isso com variáveis citadas, mas a análise é realmente problemática. Também existem outros caracteres com significados especiais no contexto de nomes de variáveis no bash, principalmente chaves, parênteses, caracteres do operador e aspas. (por exemplo,{}()=+-&'"
e mais)Eu sugeriria que praticamente você precisa encontrar outro paradigma para construir seu script. Você pode ter uma idéia de outras línguas sobre "nomes de variáveis variáveis". Isso geralmente não é uma boa ideia nos scripts de shell.
Se você editar isso ou fizer uma nova pergunta com detalhes de seu contexto e o que você está tentando realizar, podemos sugerir uma boa maneira de criar um script.
fonte
O manual do Bash define um "nome" como:
Portanto, você não pode usar um hífen em um nome.
fonte
A maioria dos shells suporta apenas az, AZ, 0-9 e _ para nomes de variáveis. Leia o segundo item nesta página .
fonte
Você pode jogar com env e sed.
Como exemplo, eu precisava ler esta variável 'ELASTICSEARCH_CLUSTER-NODES'.
O comando env produz este:
Então, para extrair a variável:
fonte
Acredito que apenas letras, números e sublinhado são permitidos para variáveis bash. Este é o caso em muitas linguagens de programação (o javascript é uma exceção).
Eu recomendo que seu script não dependa desses tipos de nomes de variáveis.
Na verdade, você deve tentar programar de forma que possa substituir nomes de variáveis por outros nomes e isso não faz diferença. Em geral, os nomes de variáveis devem descrever o que a variável contém. Isso facilita muito a depuração; se não for para você, então para o próximo desenvolvedor que está tentando descobrir o código.
fonte
Você pode usar o
env
comando para definir e desmarcar variáveis de ambiente com os hífens "-".Para definir você deve usar env para executar o seu comando:
env command
. Você passa variáveis desta maneira:Veja trabalhando com:
ou para esclarecer:
fonte