Spazi nelle assegnazioni variabili negli script di shell


17

Qual è la differenza tra le assegnazioni delle variabili seguenti?

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

C'è qualche differenza di spazio attorno all'operatore di assegnazione?


Nella maggior parte dei linguaggi di programmazione questo non farebbe alcuna differenza ... C'è davvero una differenza per cominciare? Inoltre stai parlando oldschool sh qui? non ash / zsh / bash o altre cose nuove?
Cestarian

Solo i primi esempi imposta una variabile.
DisplayName

Quindi gli ultimi 3 non generano un errore di sintassi? o hanno effettivamente significato?
Cestarian

2
@Cestarian possono significare qualcosa, se hai un comando chiamato varallora var =23passerebbe =23a var, e var = 23passerebbe =e 23a var. Oppure, se si dispone di un comando chiamato var=poi var= 23passerebbe 23al comando var=.
DisplayName

1
@Cestarian Sostituito da bash, che fa esattamente la stessa cosa shdi tutti e quattro i casi.
pfnuesel,

Risposte:


14

Dipende molto dalla shell. Se guardiamo solo alle 4 principali famiglie di conchiglie (Bourne, csh, rc, fish):

Famiglia Bourne

Cioè la shell Bourne e tutte le sue varianti e ksh, bash, ash/ dash, zsh, yash.

  • var=23: questa è la sintassi di assegnazione variabile corretta: una parola che consiste di lettere, cifre o caratteri di sottolineatura seguiti da un non quotato =che appare prima di un argomento di comando (qui è da solo)
  • var =23, il varcomando con =23come argomento (tranne in zshcui =somethingè presente un operatore speciale che si espande nel percorso del somethingcomando. Qui, è probabile che 23venga visualizzato un errore poiché è improbabile che sia un nome di comando valido).
  • var= 23: un compito var=seguito da un nome di comando 23. Questo è pensato per essere eseguito 23con var=passato al suo ambiente ( varvariabile d'ambiente con un valore vuoto).
  • var = 23, varcomando con =e 23come argomento. Prova con echo = 23per esempio.

Famiglia csh

cshe tcsh. Ci sono assegnazioni di variabili con la set var = valuesintassi per variabili scalari, set var = (a b)per array, setenv var valueper variabili di ambiente, @ var=1+1per assegnazione e valutazione aritmetica.

Così:

  • var=23sta solo invocando il var=23comando.
  • var =23sta invocando il varcomando con =23come argomento.
  • var= 23sta invocando il var=comando con 23come argomento
  • var = 23sta invocando il varcomando con =e 23come argomenti.

Famiglia rc

Questo è rc, ese akanga. In quelle shell, le variabili sono array e le assegnazioni sono var = (foo bar), con var = fooabbreviazione di var = (foo)(un array con un fooelemento) e var =abbreviazione di var = ()(array senza elemento, utilizzare var = ''per un array con un elemento vuoto).

In ogni caso, gli spazi vuoti (spazio o scheda) =sono consentiti e facoltativi. Quindi in quelle shell quei 4 comandi sono equivalenti ed equivalenti var = (23)ad assegnare un array con un solo elemento 23.

Pesce

In fish, la sintassi dell'assegnazione delle variabili è set var value1 value2. Come in rc, le variabili sono array.

Quindi il comportamento sarebbe lo stesso di csh, tranne per il fatto che fishnon ti permetterà di eseguire un comando con a =nel suo nome. Se si dispone di tale comando di una, è necessario richiamare tramite sh, per esempio: sh -c 'exec weird===cmd'.

Quindi tutto var=23e var= 23ti darà un errore, var =23chiamerà il varcomando con =23come argomento e var = 23chiamerà il varcomando con =e 23come argomenti.


8

var=23assegna 23 alla variabile var.

var =23 tenta di eseguire il comando (o alias o funzione) var con argomento=23

var = 23 idem, ma argomenti = e23

var= 23 imposta var la variabile di ambiente su stringa vuota, quindi esegue il comando23

Sì, la shell è strana come linguaggio di programmazione. Ma ha perfettamente senso come una shell per l'uso interattivo, in cui gli spazi separano comandi e argomenti. La maggior parte dei "caratteri speciali" ( =in questo caso) hanno un significato speciale solo in posizioni particolari, per consentire argomenti quasi arbitrari ai comandi. Vedi le interpretazioni di cui sopra.


3
  • var=23 è la sintassi corretta per assegnare valore a una variabile.
  • var =23è considerato come comando varcon =23opzione / argomento per comando var(sebbene la sintassi corretta / standard per argomento / opzione sia -optiono--option )
  • var= 23non assegnerà nulla a varcome lo spazio bianco interrompe il processo di assegnazione e 23sarà considerato come un altro comando. La soluzione alternativa è var=\ 23o var=' 23'per la memorizzazione di spazi bianchi.
  • var = 23ha effetto simile come discusso nel 2 ° caso.

    In realtà questo tipo di utilizzo dello spazio intorno =viene solitamente utilizzato nelle condizioni di test all'interno [[ ]]. Esempio per 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).

E dopotutto il comportamento dello spazio bianco attorno =dipende dalla tua shell e dai linguaggi di programmazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.