Espaces dans les affectations de variables dans les scripts shell

17

Quelle est la différence entre les affectations de variables ci-dessous?

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

Y a-t-il une différence d'espace autour de l'opérateur d'affectation?

ajay
la source
Dans la plupart des langages de programmation, cela ne ferait aucune différence ... Y a-t-il réellement une différence pour commencer? Vous parlez aussi oldschool sh ici? pas ash / zsh / bash ou d'autres nouvelles choses?
Cestarian
Seuls les premiers exemples définissent une variable.
DisplayName
Alors les 3 derniers ne jettent-ils pas simplement une erreur de syntaxe? ou ont-ils réellement un sens?
Cestarian
2
@Cestarian ils peuvent vouloir dire quelque chose, si vous avez une commande appelée varalors var =23serait passer =23à var, et var = 23passeriez =et 23à var. Ou, si vous avez une commande appelée, var=elle var= 23passerait 23à la commande var=.
DisplayName
1
@Cestarian Remplacé par bash, qui fait exactement la même chose que shdans les quatre cas.
pfnuesel

Réponses:

14

Cela dépend beaucoup de la coque. Si nous ne regardons que les 4 principales familles de coquilles (Bourne, csh, rc, fish):

Famille Bourne

C'est le shell Bourne et toutes ses variantes et ksh, bash, ash/ dash, zsh, yash.

  • var=23: c'est la syntaxe d'attribution de variable correcte: un mot qui se compose de lettres, de chiffres ou de soulignements non entre guillemets suivi d'un non guillemet =qui apparaît avant un argument de commande (ici, il est seul)
  • var =23, la varcommande avec =23comme argument (sauf dans le zshcas où se =somethingtrouve un opérateur spécial qui se développe sur le chemin de la somethingcommande. Ici, vous obtiendrez probablement une erreur car il 23est peu probable qu'il s'agisse d'un nom de commande valide).
  • var= 23: une affectation var=suivie d'un nom de commande 23. Cela est censé s'exécuter 23avec var=passé à son environnement ( varvariable d'environnement avec une valeur vide).
  • var = 23, varcommande avec =et 23comme argument. Essayez avec echo = 23par exemple.

Famille Csh

cshet tcsh. Les affectations de variables existent avec la set var = valuesyntaxe des variables scalaires, set var = (a b)des tableaux, setenv var valuedes variables d'environnement, @ var=1+1des affectations et de l'évaluation arithmétique.

Donc:

  • var=23appelle simplement la var=23commande.
  • var =23appelle la varcommande avec =23comme argument.
  • var= 23appelle la var=commande avec 23comme argument
  • var = 23appelle la varcommande avec =et 23comme arguments.

Famille RC

C'est rc, eset akanga. Dans ces shells, les variables sont des tableaux et les affectations sont avec var = (foo bar), avec var = fooétant court pour var = (foo)(un tableau avec un fooélément) et var =court pour var = ()(tableau sans élément, utilisez var = ''pour un tableau avec un élément vide).

Dans tous les cas, les espaces (espace ou tabulation) autour =sont autorisés et facultatifs. Donc, dans ces shells, ces 4 commandes sont équivalentes et équivalentes var = (23)à affecter un tableau avec un élément 23.

Poisson

Dans fish, la syntaxe d'affectation des variables est set var value1 value2. Comme dans rc, les variables sont des tableaux.

Le comportement serait donc le même qu'avec csh, sauf que fishcela ne vous permettra pas d'exécuter une commande avec un =dans son nom. Si vous avez une telle commande, vous devez l' appeler via shpar exemple: sh -c 'exec weird===cmd'.

Donc tout var=23et var= 23vous donnera une erreur, var =23appellera la varcommande avec =23comme argument et var = 23appellera la varcommande avec =et 23comme arguments.

Stéphane Chazelas
la source
8

var=23assigne 23 à la variable var.

var =23essaie d'exécuter la commande (ou l'alias ou la fonction) varavec un argument=23

var = 23idem, mais les arguments =et23

var= 23définit varla variable d'environnement sur une chaîne vide, puis exécute la commande23

Oui, shell est bizarre comme langage de programmation. Mais il est parfaitement logique en tant que shell pour une utilisation interactive, où les espaces séparent les commandes et les arguments. La plupart des "caractères spéciaux" ( =dans ce cas) n'ont une signification spéciale que dans des positions particulières, pour permettre des arguments presque arbitraires aux commandes. Voir les interprétations ci-dessus.

vonbrand
la source
3
  • var=23 est la syntaxe correcte pour attribuer une valeur à une variable.
  • var =23est considéré comme une commande varavec l' =23option / argument pour la commande var(bien que la syntaxe correcte / standard pour l'argument / l'option soit -optionou --option)
  • var= 23n'assigne rien varcar l'espace blanc rompt le processus d'affectation et 23sera considéré comme une autre commande. La solution de contournement est var=\ 23ou var=' 23'pour stocker des espaces blancs.
  • var = 23a un effet similaire à celui discuté dans le 2 e cas.

    En fait, ce type d'utilisation de l'espace autour =est généralement utilisé dans des conditions de test à l'intérieur [[ ]]. Exemple pour 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).

Et après tout, le comportement des espaces blancs autour =dépend de votre shell et des langages de programmation.

Pandya
la source