Comando non trovato errore nell'assegnazione della variabile Bash


521

Ho questo script chiamato test.sh:

#!/bin/bash
STR = "Hello World"
echo $STR

quando corro sh test.shottengo questo:

test.sh: line 2: STR: command not found

Che cosa sto facendo di sbagliato? Guardo tutorial di scripting bash estremamente semplici / per principianti online ed è così che si dice per dichiarare le variabili ... Quindi non sono sicuro di cosa sto facendo di sbagliato.

Sono su Ubuntu Server 9.10. E sì, bash si trova a /bin/bash.


49
Sono contento che tu abbia fatto la domanda, non sei il solo baraccone!
Macina il gorilla il

6
Grazie per aver posto questa domanda. Questa non è una domanda di cui essere imbarazzati. Sto lavorando a tarda notte in ufficio e non c'è nessun esperto di Bash intorno a me per rispondere a questo.
Adway Lele,

3
In questi giorni (quasi sette anni dopo!) C'è un linter / analizzatore FOSS chiamato shellcheck che rileverà automaticamente questo e altri problemi di sintassi comuni. Può essere utilizzato online o installato offline e integrato nel tuo editor.
quell'altro ragazzo l'


Ti consiglierei di usare: #!/usr/bin/env bashinvece di mettere direttamente a #!/bin/bashmeno che tu non sia assolutamente sicuro che tu bashsia a /bincausa di questa risposta: stackoverflow.com/a/21613044/3589567
Alejandro Blasco,

Risposte:


929

Non puoi avere spazi attorno al segno '='.

Quando scrivi:

STR = "foo"

bash tenta di eseguire un comando chiamato STR con 2 argomenti (le stringhe '=' e 'foo')

Quando scrivi:

STR =foo

bash tenta di eseguire un comando denominato STR con 1 argomento (la stringa '= pippo')

Quando scrivi:

STR= foo

bash tenta di eseguire il comando foo con STR impostato sulla stringa vuota nel suo ambiente.

Non sono sicuro se questo aiuta a chiarire o se si tratta di mera offuscamento, ma nota che:

  1. il primo comando è esattamente equivalente a: STR "=" "foo",
  2. il secondo è uguale a STR "=foo",
  3. e l'ultimo è equivalente a STR="" foo.

La sezione pertinente delle specifiche del linguaggio sh, sezione 2.9.1 afferma:

Un "comando semplice" è una sequenza di assegnazioni e reindirizzamenti variabili facoltativi, in qualsiasi sequenza, facoltativamente seguiti da parole e reindirizzamenti, terminati da un operatore di controllo.

In quel contesto, a wordè il comando che bash verrà eseguito. Qualsiasi stringa contenente =(in qualsiasi posizione diversa all'inizio della stringa) che non è un reindirizzamento è un'assegnazione variabile, mentre qualsiasi stringa che non è un reindirizzamento e che non contiene =è un comando. In STR = "foo", STRnon è un'assegnazione variabile.


2
Se hai una variabile con un nome che contiene "-", si verifica lo stesso errore. In tal caso, la soluzione è rimuovere il "-"
chomp

1
chomp @ Nella regola 7b della sezione 2.10.10 di pubs.opengroup.org/onlinepubs/9699919799 "Se tutti i caratteri che precedono '=' formano un nome valido (vedi Nome XBD), il token ASSIGNMENT_WORD deve essere restituito." Seguendo il collegamento alla sezione 3.231 di pubs.opengroup.org/onlinepubs/9699919799 , troviamo "Nel linguaggio di comando della shell, una parola composta esclusivamente da caratteri di sottolineatura, cifre e alfabeti dal set di caratteri portatile. Il primo carattere di un nome è non una cifra ". Quindi la parola FOO-BAR=quxnon è un'assegnazione variabile poiché FOO-BARnon è un nome valido.
William Pursell,

2
Offro una generosità per premiare questa chiara spiegazione a un problema sempre comune per i principianti (beh, e anche per poterlo trovare più velocemente ogni volta che voglio collegarlo: D). Grazie per aver reso le cose così facili!
fedorqui "SO smettere di danneggiare" il

1
@fedorqui Grazie! Non sono del tutto convinto che questa sia una spiegazione chiara e spesso mi chiedo se possa essere semplificata.
William Pursell,

159

Rilascia gli spazi attorno al =segno:

#!/bin/bash 
STR="Hello World" 
echo $STR 

9
Questo è divertente, però, così come set foo = barè un errore comune anche nei file batch di Windows, e lì il linguaggio batch è ridicolizzato per questo ;-)
Joey,

Grazie @joey. Ero bloccato nello scrivere uno script di shell in cui stavo inizializzando le variabili con spazi dopo "=". Mi hai salvato la giornata
Lalit Rao,

Perché bash non accetta numeri nel campo a sinistra? come 3 = "Hello World", si lamenta del comando non trovato
Freedo,

6

Nella modalità interattiva tutto sembra a posto:

$ str="Hello World"
$ echo $str
Hello World

Ovviamente (!) Come diceva Johannes, nessuno spazio intorno =. Nel caso in cui vi sia spazio intorno, =nella modalità interattiva dà errori come

Nessun comando 'str' trovato


2
Ma nota che l'OP stava dicendo STR = "Hello World", quindi questa risposta non si applica qui.
fedorqui "SO smettere di danneggiare"

@Arkapravo qual è il significato della modalità interattiva, ha qualcosa a che fare con il $marchio
Kasun Siyambalapitiya

@KasunSiyambalapitiya per "modalità interattiva" intende digitare quei comandi nel terminale reale, non in uno script.
numbermaniac

5

So che a questa risposta è stata data una risposta di altissima qualità. Ma, in breve, non puoi avere spazi.

#!/bin/bash
STR = "Hello World"
echo $STR

Non ha funzionato a causa degli spazi attorno al segno uguale. Se dovessi correre ...

#!/bin/bash
STR="Hello World"
echo $STR

Funzionerebbe


2

Quando si definisce una variabile, non è necessario inserire spazi aggiuntivi.

Per esempio

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"

Quindi rimuovere gli spazi:

name="Stack Overflow" 

e funzionerà benissimo.

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.