Espacios en asignaciones variables en scripts de shell

17

¿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?

ajay
fuente
En la mayoría de los lenguajes de programación esto no haría ninguna diferencia ... ¿Hay realmente una diferencia para empezar? ¿También estás hablando de la vieja escuela aquí? no ash / zsh / bash u otras cosas nuevas?
Cestariano
Solo los primeros ejemplos establecen una variable.
DisplayName
Entonces, ¿los últimos 3 no arrojan un error de sintaxis? ¿o realmente tienen significado?
Cestariano
2
@Cestarian que pueden significar algo, si tiene un comando llamado varentonces var =23sería pase =23a var, y var = 23pasaría =y 23que var. O, si usted tiene un comando llamado var=entonces var= 23pasaría 23al comando var=.
DisplayName
1
@Cestarian Reemplazado por bash, que hace exactamente lo mismo que shen los cuatro casos.
pfnuesel

Respuestas:

14

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, el varcomando con =23como argumento (excepto en zshdonde =somethinges un operador especial que se expande a la ruta del somethingcomando. Aquí, es probable que obtenga un error, ya que 23es poco probable que sea un nombre de comando válido).
  • var= 23: una tarea var=seguida de un nombre de comando 23. Eso está destinado a ejecutarse 23con var=pasado a su entorno ( varvariable de entorno con un valor vacío).
  • var = 23, varcomando con =y 23como argumento. Prueba con, echo = 23por ejemplo.

Familia csh

cshy tcsh. Hay asignaciones variables con la set var = valuesintaxis para variables escalares, set var = (a b)para matrices, setenv var valuepara variables de entorno, @ var=1+1para asignación y evaluación aritmética.

Entonces:

  • var=23solo invoca el var=23comando.
  • var =23invoca el varcomando con =23como argumento.
  • var= 23invoca el var=comando con 23como argumento
  • var = 23invoca el varcomando con =y 23como argumentos.

Familia rc

Eso es rc, esy akanga. En esos shells, las variables son matrices y las asignaciones son con var = (foo bar), var = foosiendo short para var = (foo)(una matriz con un fooelemento) y var =short para var = ()(matriz sin elemento, use var = ''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 equivalentes var = (23)a asignar una matriz con un elemento 23.

Pescado

En fish, la sintaxis de asignación de variables es set var value1 value2. Como en rc, las variables son matrices.

Por lo tanto, el comportamiento sería el mismo que con csh, excepto que fishno le permitirá ejecutar un comando con un =en su nombre. Si usted tiene un comando tal, es necesario invocar a través de sh, por ejemplo: sh -c 'exec weird===cmd'.

Entonces todo var=23y var= 23le dará un error, var =23llamará al varcomando con =23como argumento y var = 23llamará al varcomando con =y 23como argumentos.

Stéphane Chazelas
fuente
8

var=23asigna 23 a la variable var.

var =23intenta ejecutar el comando (o alias o función) varcon argumento=23

var = 23lo mismo, pero los argumentos =y23

var= 23establece varla 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.

vonbrand
fuente
3
  • var=23 es la sintaxis correcta para asignar valor a una variable.
  • var =23se considera como comando varcon =23opción / argumento para comando var(aunque la sintaxis correcta / estándar para argumento / opción es -optiono --option)
  • var= 23no asignará nada varya que el espacio en blanco interrumpe el proceso de asignación y 23se considerará como otro comando. La solución alternativa es var=\ 23o var=' 23'para almacenar espacios en blanco.
  • var = 23tiene un efecto similar al discutido en el caso.

    En realidad, este tipo de uso del espacio alrededor = generalmente se usa en condiciones de prueba en el interior [[ ]]. Ejemplo 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).

Y después de todo, el comportamiento del espacio en blanco alrededor = depende de su shell y los lenguajes de programación.

Pandya
fuente