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?
shell
variable
assignment
ajay
la source
la source
var
alorsvar =23
serait passer=23
à var, etvar = 23
passeriez=
et23
à var. Ou, si vous avez une commande appelée,var=
ellevar= 23
passerait23
à la commandevar=
.bash
, qui fait exactement la même chose quesh
dans les quatre cas.Réponses:
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
, lavar
commande avec=23
comme argument (sauf dans lezsh
cas où se=something
trouve un opérateur spécial qui se développe sur le chemin de lasomething
commande. Ici, vous obtiendrez probablement une erreur car il23
est peu probable qu'il s'agisse d'un nom de commande valide).var= 23
: une affectationvar=
suivie d'un nom de commande23
. Cela est censé s'exécuter23
avecvar=
passé à son environnement (var
variable d'environnement avec une valeur vide).var = 23
,var
commande avec=
et23
comme argument. Essayez avececho = 23
par exemple.Famille Csh
csh
ettcsh
. Les affectations de variables existent avec laset var = value
syntaxe des variables scalaires,set var = (a b)
des tableaux,setenv var value
des variables d'environnement,@ var=1+1
des affectations et de l'évaluation arithmétique.Donc:
var=23
appelle simplement lavar=23
commande.var =23
appelle lavar
commande avec=23
comme argument.var= 23
appelle lavar=
commande avec23
comme argumentvar = 23
appelle lavar
commande avec=
et23
comme arguments.Famille RC
C'est
rc
,es
etakanga
. Dans ces shells, les variables sont des tableaux et les affectations sont avecvar = (foo bar)
, avecvar = foo
étant court pourvar = (foo)
(un tableau avec unfoo
élément) etvar =
court pourvar = ()
(tableau sans élément, utilisezvar = ''
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 équivalentesvar = (23)
à affecter un tableau avec un élément23
.Poisson
Dans
fish
, la syntaxe d'affectation des variables estset var value1 value2
. Comme dansrc
, les variables sont des tableaux.Le comportement serait donc le même qu'avec
csh
, sauf quefish
cela ne vous permettra pas d'exécuter une commande avec un=
dans son nom. Si vous avez une telle commande, vous devez l' appeler viash
par exemple:sh -c 'exec weird===cmd'
.Donc tout
var=23
etvar= 23
vous donnera une erreur,var =23
appellera lavar
commande avec=23
comme argument etvar = 23
appellera lavar
commande avec=
et23
comme arguments.la source
var=23
assigne 23 à la variablevar
.var =23
essaie d'exécuter la commande (ou l'alias ou la fonction)var
avec un argument=23
var = 23
idem, mais les arguments=
et23
var= 23
définitvar
la 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.la source
var=23
est la syntaxe correcte pour attribuer une valeur à une variable.var =23
est considéré comme une commandevar
avec l'=23
option / argument pour la commandevar
(bien que la syntaxe correcte / standard pour l'argument / l'option soit-option
ou--option
)var= 23
n'assigne rienvar
car l'espace blanc rompt le processus d'affectation et23
sera considéré comme une autre commande. La solution de contournement estvar=\ 23
ouvar=' 23'
pour stocker des espaces blancs.var = 23
a 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:Et après tout, le comportement des espaces blancs autour
=
dépend de votre shell et des langages de programmation.la source