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

17

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

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

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

ajay
fonte
Na maioria das linguagens de programação, isso não faria diferença ... Existe realmente uma diferença para começar? Você também está falando de escola velha aqui? não ash / zsh / bash ou outras coisas novas?
Cestarian
Somente os primeiros exemplos definem uma variável.
DisplayName
Os últimos 3 não lançam apenas um erro de sintaxe? ou eles realmente têm significado?
Cestarian
2
@ Cestarian eles podem significar alguma coisa, se você tiver um comando chamado, varentão var =23passaria =23para var e var = 23passaria =e 23para var. Ou, se você tiver um comando chamado var=, var= 23passaria 23para o comando var=.
DisplayName
1
@Cestarian Substituído por bash, que faz exatamente a mesma coisa que shnos quatro casos.
Pfnuesel

Respostas:

14

Isso depende muito da concha. Se olharmos apenas para as quatro principais famílias de cascas (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 correta de atribuição de variável: uma palavra que consiste em letras, dígitos ou sublinhados sem aspas, seguida por uma sem aspas =que aparece antes de um argumento de comando (aqui está por si só)
  • var =23, o varcomando com =23o argumento as (exceto zshonde =somethingestá um operador especial que se expande para o caminho do somethingcomando. Aqui, é provável que você receba um erro, pois 23é improvável que seja um nome de comando válido).
  • var= 23: uma atribuição var=seguida por um nome de comando 23. Isso deve ser executado 23com var=passado para seu ambiente ( varvariável de ambiente com um valor vazio).
  • var = 23, varcomando com =e 23como argumento. Tente com echo = 23por exemplo.

Família Csh

cshe tcsh. Designações de variáveis ​​que existem com a set var = valuesintaxe para variáveis ​​escalares, set var = (a b)para matrizes, setenv var valuepara variáveis ​​de ambiente, @ var=1+1para atribuição e avaliação aritmética.

Então:

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

Família rc

Isso é rc, ese akanga. Nessas shells, as variáveis ​​são matrizes e as atribuições são var = (foo bar), com var = fooabreviação de var = (foo)(uma matriz com um fooelemento) e var =abreviação de var = ()(matriz sem elemento, use var = ''para uma matriz com um elemento vazio).

Em qualquer caso, espaços em branco (espaço ou tabulação) ao redor =são permitidos e opcionais. Portanto, nesses shells esses 4 comandos são equivalentes e equivalentes var = (23)a atribuir uma matriz com um elemento 23.

Peixe

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

Portanto, o comportamento seria o mesmo que com csh, exceto que fishnão permitirá que você execute um comando com a =em seu nome. Se você tem tal comando de um, você precisa chamá-lo através de sh, por exemplo: sh -c 'exec weird===cmd'.

Então, tudo var=23e var= 23lhe dará um erro, var =23chamará o varcomando com =23como argumento e var = 23chamará o varcomando com =e 23como argumentos.

Stéphane Chazelas
fonte
8

var=23atribui 23 à variável var.

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

var = 23idem, mas argumentos =e23

var= 23define vara variável de ambiente como sequência em branco e executa o comando23

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

vonbrand
fonte
3
  • var=23 é a sintaxe correta para atribuir valor a uma variável.
  • var =23é considerado como comando varcom =23opção / argumento para comando var(embora a sintaxe correta / padrão para argumento / opção seja -optionou --option)
  • var= 23irá atribuir nada a, varpois o espaço em branco interrompe o processo de atribuição e 23será considerado como outro comando. A solução alternativa é var=\ 23ou var=' 23'para armazenar espaço em branco.
  • var = 23tem efeito semelhante ao discutido no caso.

    Na verdade, esse tipo de uso de espaço ao redor =geralmente é usado em condições de teste internas [[ ]]. Exemplo para 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, afinal, o comportamento do espaço em branco =depende do seu shell e das linguagens de programação.

Pandya
fonte