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?
shell
variable
assignment
ajay
fonte
fonte
var
entãovar =23
passaria=23
para var evar = 23
passaria=
e23
para var. Ou, se você tiver um comando chamadovar=
,var= 23
passaria23
para o comandovar=
.bash
, que faz exatamente a mesma coisa quesh
nos quatro casos.Respostas:
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
, ovar
comando com=23
o argumento as (excetozsh
onde=something
está um operador especial que se expande para o caminho dosomething
comando. Aqui, é provável que você receba um erro, pois23
é improvável que seja um nome de comando válido).var= 23
: uma atribuiçãovar=
seguida por um nome de comando23
. Isso deve ser executado23
comvar=
passado para seu ambiente (var
variável de ambiente com um valor vazio).var = 23
,var
comando com=
e23
como argumento. Tente comecho = 23
por exemplo.Família Csh
csh
etcsh
. Designações de variáveis que existem com aset var = value
sintaxe 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 invocando ovar=23
comando.var =23
está chamando ovar
comando com=23
como argumento.var= 23
está chamando ovar=
comando com23
como argumentovar = 23
está chamando ovar
comando com=
e23
como argumentos.Família rc
Isso é
rc
,es
eakanga
. Nessas shells, as variáveis são matrizes e as atribuições sãovar = (foo bar)
, comvar = foo
abreviação devar = (foo)
(uma matriz com umfoo
elemento) evar =
abreviação devar = ()
(matriz sem elemento, usevar = ''
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 equivalentesvar = (23)
a atribuir uma matriz com um elemento23
.Peixe
Em
fish
, a sintaxe da atribuição de variável éset var value1 value2
. Como emrc
, variáveis são matrizes.Portanto, o comportamento seria o mesmo que com
csh
, exceto quefish
nã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 desh
, por exemplo:sh -c 'exec weird===cmd'
.Então, tudo
var=23
evar= 23
lhe dará um erro,var =23
chamará ovar
comando com=23
como argumento evar = 23
chamará ovar
comando com=
e23
como argumentos.fonte
var=23
atribui 23 à variávelvar
.var =23
tenta executar o comando (ou alias ou função)var
com argumento=23
var = 23
idem, mas argumentos=
e23
var= 23
definevar
a 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.fonte
var=23
é a sintaxe correta para atribuir valor a uma variável.var =23
é considerado como comandovar
com=23
opção / argumento para comandovar
(embora a sintaxe correta / padrão para argumento / opção seja-option
ou--option
)var= 23
irá atribuir nada a,var
pois o espaço em branco interrompe o processo de atribuição e23
será considerado como outro comando. A solução alternativa évar=\ 23
ouvar=' 23'
para armazenar espaço em branco.var = 23
tem efeito semelhante ao discutido no 2º caso.Na verdade, esse tipo de uso de espaço ao redor
=
geralmente é usado em condições de teste internas[[ ]]
. Exemplo para Bash:E, afinal, o comportamento do espaço em branco
=
depende do seu shell e das linguagens de programação.fonte