Espaços em atribuições de variáveis em shell scripts

10

Qual é a diferença entre as atribuições de variáveis abaixo?

var=23
var =23
var= 23
var = 23

Existe alguma diferença no espaço em torno do operador de atribuição?

    
por ajay 30.01.2016 / 14:20

3 respostas

8

Isso depende muito do shell. Se olharmos apenas para as 4 principais famílias de shell (Bourne, csh, rc, fish):

Família Bourne

Esse é o shell Bourne e todas as suas variantes e ksh , bash , ash / dash , zsh , yash .

  • var=23 : essa é a sintaxe de atribuição de variável correta: uma palavra que consiste em letras não citadas seguidas por um = sem aspas que aparece antes de um argumento de comando (aqui está por conta própria)
  • var =23 , o comando var com =23 como argumento (exceto em zsh onde =something é um operador especial que se expande para o caminho do comando something . Aqui, você provavelmente obteria um erro como 23 é improvável que seja um nome de comando válido).
  • var= 23 : uma atribuição var= seguido por um nome de comando 23 . Isso significa executar 23 com var= passado para seu ambiente ( var de variável de ambiente com um valor vazio).
  • Comando var = 23 , var com = e 23 como argumento. Experimente com echo = 23 , por exemplo.

Família Csh

csh e tcsh . Atribuições variáveis existem com a sintaxe set var = value para variáveis escalares, set var = (a b) para matrizes, setenv var value para variáveis de ambiente, @ var=1+1 para atribuição e avaliação aritmética.

Então:

  • var=23 está apenas chamando o comando var=23 .
  • var =23 está chamando o comando var com =23 como argumento.
  • var= 23 está chamando o comando var= com 23 como argumento
  • var = 23 está chamando o comando var com = e 23 como argumentos.

Família Rc

Isso é rc , es e akanga . Nesses shells, as variáveis são arrays e atribuições com var = (foo bar) , com var = foo sendo curto para var = (foo) (um array com um foo element) e var = short para var = () (array sem elemento, use var = '' para um array com um elemento vazio).

Em qualquer caso, os espaços em branco (espaço ou tabulação) em torno de = são permitidos e opcionais. Então, nesses shells, esses 4 comandos são equivalentes e equivalentes a var = (23) para atribuir um array com um elemento sendo 23 .

Peixe

Em fish , a sintaxe de atribuição de variáveis é set var value1 value2 . Como em rc , as variáveis são matrizes.

Assim, o comportamento seria o mesmo que com csh , exceto que fish não permite executar um comando com = em seu nome. Se você tiver esse comando, precisará invocá-lo via env , por exemplo: env weird===cmd .

Assim, todos os var=23 e var= 23 darão um erro, var =23 chamará o comando var com =23 como argumento e var = 23 chamará o comando var com = e 23 como argumentos.

    
por 20.07.2016 / 23:41
7

var=23 atribui 23 à variável var .

var =23 tenta executar o comando (ou alias ou função) var com o argumento =23

var = 23 idem, mas os argumentos = e 23

var= 23 sets var variável de ambiente para string em branco, em seguida, executa o comando 23

Sim, o shell é estranho como uma linguagem de programação. Mas faz todo o sentido como um shell para uso interativo, onde espaços separam comandos e argumentos. A maioria dos "caracteres especiais" ( = neste caso) tem significado especial apenas em posições particulares, para permitir que argumentos quase arbitrários sejam comandados. Veja as interpretações acima.

    
por 30.01.2016 / 15:10
3
  • var=23 é a sintaxe correta para atribuir valor a uma variável.
  • var =23 é considerado como o comando var com =23 opção / argumento para o comando var (Embora a sintaxe correta / padrão para o argumento / opção seja -option ou --option )
  • var= 23 não atribuirá nada a var , pois o espaço em branco interrompe o processo de atribuição e 23 será considerado como outro comando. A solução alternativa é var=\ 23 ou var=' 23' para armazenar espaço em branco.
  • var = 23 tem efeito semelhante ao discutido no caso 2 nd .

    Na verdade, esse tipo de uso de espaço em torno de = é normalmente usado em condições de teste dentro de [[ ]] . Exemplo para o Bash:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).
    

E depois de tudo, o comportamento do espaço em branco em torno de = depende do seu shell e das linguagens de programação.

    
por 30.01.2016 / 15:11