Pode incluir variável de shell - caractere?

29

Não consigo usar - em variáveis no shell. Existe uma maneira de poder usá-lo, porque eu tenho um script que depende de tais 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 e o segundo funciona bem.

    
por xyz 31.10.2011 / 09:29

10 respostas

36

Eu nunca encontrei um shell estilo Bourne que permitisse - em um nome de variável. Somente letras ASCII (de qualquer um dos casos), _ e dígitos são suportados e o primeiro caractere não deve ser um dígito.

Se você tiver um programa que requer uma variável de ambiente que não corresponda às restrições do shell, inicie-o com o programa env .

env 'strange-name=some value' myprogram

Observe que alguns shells (por exemplo, traço moderno , mksh, zsh) remova as variáveis cujo nome elas não gostam do ambiente. ( Shellshock fez com que as pessoas fossem mais cautelosas com relação aos nomes das variáveis de ambiente, portanto as restrições provavelmente se tornarão mais rigorosas com o tempo Portanto, se você precisar passar uma variável cujo nome contenha um caractere especial para um programa, passe-a diretamente, sem um shell intermediário ( env 'strange-name=some value' sh -c'…; myprogram' pode ou não funcionar).

    
por 31.10.2011 / 23:04
12

Isso não é possível no Bash.

Da seção Definições na página de manual de bash :

name A word consisting only of alphanumeric characters and underscores, and beginning with an alphabetic character or an underscore. Also referred to as an identifier.

Da seção Parâmetros na página de manual de bash :

A parameter is an entity that stores values. It can be a name, a number, or one of the special characters listed below under Special Parameters. A variable is a parameter denoted by a name.

    
por 31.10.2011 / 09:37
12

Você pode acessar uma variável hifenizada usando uma referência indireta.

$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello
    
por 21.08.2015 / 06:48
4

Se o seu script depende de ter nomes de variáveis com hífens, isso é um erro de programação. Se for conveniente para você por causa das 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?

hyphenated_name="a-b"
unhyphenated_name=$(echo $hyphenated_name | tr '-' '_')
declare -x $unhyphenated_name="some value"

O Bash permite que '-' apareça nos nomes das funções. Eu faço isso toda hora. Por exemplo:

function foo-bar() {
   echo "$@"
}
    
por 16.04.2013 / 01:15
3

O traço ( - ) é um caractere de quebra e não é permitido como parte de nomes de variáveis. Existem maneiras de hackear isso com variáveis citadas, mas a análise é realmente problemática. Há também outros caracteres com significados especiais no contexto de nomes de variáveis no bash, notadamente chaves, parênteses, caracteres do operador e aspas. (por exemplo, {}()=+-&'" e mais)

Eu sugeriria que praticamente você precisa encontrar outro paradigma no qual construir seu script. Você pode ter uma idéia pendente de outras linguagens sobre "nomes de variáveis variáveis". Isso geralmente não é uma boa ideia em scripts de shell.

Se você editar isso ou fizer uma nova pergunta com detalhes sobre seu contexto e o que está tentando realizar, poderemos sugerir uma boa maneira de fazer o script.

    
por 31.10.2011 / 09:38
2

O manual do Bash define um "nome" como:

A 'word' consisting solely of letters, numbers, and underscores, and beginning with a letter or underscore. 'Name's are used as shell variable and function names. Also referred to as an 'identifier'.

Então você não pode usar um hífen em um nome.

    
por 31.10.2011 / 09:42
1

A maioria das shells suporta apenas a-z, A-Z, 0-9 e _ para nomes de variáveis. Leia o segundo item em esta página .

    
por 31.10.2011 / 09:41
0

Acredito que apenas letras, números e sublinhados são permitidos para variáveis bash. Este é o caso em muitas linguagens de programação (sendo o javascript uma exceção).

Eu não recomendo que seu script dependa desses tipos de nomes de variáveis.

Na verdade, você deve tentar programar de maneira que possa substituir nomes de variáveis por outros nomes e isso não faz diferença. Em geral, os nomes das variáveis devem descrever o que a variável contém. Isso facilita muito a depuração; se não para você, então para o próximo desenvolvedor que está tentando descobrir o código.

    
por 31.10.2011 / 09:42
0

Parece que há um problema conceitual aqui, em vez de um problema de programação. Seria útil para você elaborar o que você realmente precisa que o script faça.

Um script é essencialmente um algoritmo (ou heurística) para resolver um problema. É uma ferramenta que produz uma solução, não a solução em si. Por causa disso e porque o escopo da maioria das variáveis em um script é restrito ao próprio script e possivelmente a outros scripts que ele chama, ele não deve fazer nenhuma diferença funcional para as variáveis que são chamadas. O único (mas importante) significado dos nomes de variáveis é sua contribuição para tornar o script legível e compreensível para um ser humano. O computador (shell) não se importa.

Tudo o que você precisa para procurar um caminho específico provavelmente será a saída do script e, com um pouco de inteligência, você pode fazer com que o seu script produza praticamente qualquer cadeia de caracteres que você possa imaginar em quase qualquer idioma - mesmo aqueles que costumavam ser usados para fazer um terminal baseado em caracteres parecer um pouco com um gui com texto e planos de fundo coloridos, etc. Existem até mesmo ferramentas simples que permitem que um script use caixas de diálogo de gui e outros elementos gráficos.

    
por 05.11.2011 / 11:51
0

Você pode usar o comando env para definir e desassociar variáveis de ambiente com hiphens "-".

Para definir você deve usar env para executar seu comando: env command . Você passa as variáveis desta maneira:

env a-b=c command

Veja como funciona:

env a-b=c env

ou para deixar mais claro:

env a-b=c env|grep 'a-b'
    
por 06.06.2018 / 22:44