¿Cuál es la diferencia entre las asignaciones de variables a continuación?
var=23
var =23
var= 23
var = 23
¿Hay alguna diferencia en el espacio alrededor del operador de asignación?
shell
variable
assignment
ajay
fuente
fuente
var
entoncesvar =23
sería pase=23
a var, yvar = 23
pasaría=
y23
que var. O, si usted tiene un comando llamadovar=
entoncesvar= 23
pasaría23
al comandovar=
.bash
, que hace exactamente lo mismo quesh
en los cuatro casos.Respuestas:
Eso depende mucho de la cáscara. Si solo miramos las 4 familias principales de shell (Bourne, csh, rc, fish):
Familia Bourne
Esa es la cáscara de Bourne y todas sus variantes y
ksh
,bash
,ash
/dash
,zsh
,yash
.var=23
: esa es la sintaxis correcta de asignación de variable: una palabra que consiste en letras, dígitos o guiones bajos sin comillas seguidos de una sin comillas=
que aparece antes de un argumento de comando (aquí está solo)var =23
, elvar
comando con=23
como argumento (excepto enzsh
donde=something
es un operador especial que se expande a la ruta delsomething
comando. Aquí, es probable que obtenga un error, ya que23
es poco probable que sea un nombre de comando válido).var= 23
: una tareavar=
seguida de un nombre de comando23
. Eso está destinado a ejecutarse23
convar=
pasado a su entorno (var
variable de entorno con un valor vacío).var = 23
,var
comando con=
y23
como argumento. Prueba con,echo = 23
por ejemplo.Familia csh
csh
ytcsh
. Hay asignaciones variables con laset var = value
sintaxis para variables escalares,set var = (a b)
para matrices,setenv var value
para variables de entorno,@ var=1+1
para asignación y evaluación aritmética.Entonces:
var=23
solo invoca elvar=23
comando.var =23
invoca elvar
comando con=23
como argumento.var= 23
invoca elvar=
comando con23
como argumentovar = 23
invoca elvar
comando con=
y23
como argumentos.Familia rc
Eso es
rc
,es
yakanga
. En esos shells, las variables son matrices y las asignaciones son convar = (foo bar)
,var = foo
siendo short paravar = (foo)
(una matriz con unfoo
elemento) yvar =
short paravar = ()
(matriz sin elemento, usevar = ''
para una matriz con un elemento vacío).En cualquier caso, los espacios en blanco (espacio o tabulación) alrededor
=
están permitidos y son opcionales. Entonces, en esos shells, esos 4 comandos son equivalentes y equivalentesvar = (23)
a asignar una matriz con un elemento23
.Pescado
En
fish
, la sintaxis de asignación de variables esset var value1 value2
. Como enrc
, las variables son matrices.Por lo tanto, el comportamiento sería el mismo que con
csh
, excepto quefish
no le permitirá ejecutar un comando con un=
en su nombre. Si usted tiene un comando tal, es necesario invocar a través desh
, por ejemplo:sh -c 'exec weird===cmd'
.Entonces todo
var=23
yvar= 23
le dará un error,var =23
llamará alvar
comando con=23
como argumento yvar = 23
llamará alvar
comando con=
y23
como argumentos.fuente
var=23
asigna 23 a la variablevar
.var =23
intenta ejecutar el comando (o alias o función)var
con argumento=23
var = 23
lo mismo, pero los argumentos=
y23
var= 23
establecevar
la variable de entorno en una cadena en blanco, luego ejecuta el comando23
Sí, Shell es extraño como lenguaje de programación. Pero tiene mucho sentido como un shell para uso interactivo, donde los espacios separan comandos y argumentos. La mayoría de los "caracteres especiales" (
=
en este caso) tienen un significado especial solo en posiciones particulares, para permitir argumentos casi arbitrarios a los comandos. Vea las interpretaciones anteriores.fuente
var=23
es la sintaxis correcta para asignar valor a una variable.var =23
se considera como comandovar
con=23
opción / argumento para comandovar
(aunque la sintaxis correcta / estándar para argumento / opción es-option
o--option
)var= 23
no asignará nadavar
ya que el espacio en blanco interrumpe el proceso de asignación y23
se considerará como otro comando. La solución alternativa esvar=\ 23
ovar=' 23'
para almacenar espacios en blanco.var = 23
tiene un efecto similar al discutido en el 2º caso.En realidad, este tipo de uso del espacio alrededor
=
generalmente se usa en condiciones de prueba en el interior[[ ]]
. Ejemplo para Bash:Y después de todo, el comportamiento del espacio en blanco alrededor
=
depende de su shell y los lenguajes de programación.fuente