2010-05-06 12 views
7

Sto tentando di dichiarare una matrice in bash, ma quando viene eseguito il codice dice che non riesce a trovare la matrice. Ho provato a scrivere la dichiarazione dell'array in molti modi diversi, ma sembra non importa quanto cerco di dichiararlo e non riesco a farlo funzionare. Originariamente ho provato a dichiarare come tale:Array in Bash non trovato

candidate[1]= 0 
candidate[2]= 0 
candidate[3]= 0 

I messaggi di errore restituiti sono:

votecalculation.sh: 13: candidate[1]=: not found 
votecalculation.sh: 14: candidate[2]=: not found 
votecalculation.sh: 15: candidate[3]=: not found 

Dopo questo ho cercato un'altra soluzione che ho trovato on-line:

ARRAY=('can1' 'can2' 'can3') 

Quando ciò viene utilizzato restituisce questo errore:

votecalculation.sh: 12: Syntax error: "(" unexpected 

Sono nuovo di Bash e sto diventando molto confuso sugli array. C'è un modo specifico per dichiarare un array o sto semplicemente sbagliando?

+0

Ok, quindi alla fine ho capito il problema. Anche se la testa del file era #!/Bin/bash, il nome del file terminava con .sh. Dopo aver cambiato l'estensione del file in .bash ed eseguito usando "bash votecalculations.bash" nel terminale funziona. Grazie ancora a tutti per il vostro aiuto! – Waffle

+1

FYI l'estensione del file non ha importanza ... puoi lasciarla come '.sh' o addirittura non avere alcuna estensione di file, a patto che tu la usi con bash. –

risposta

4
#!/bin/bash 

myarray[0]=hello 
myarray[1]=world 

echo ${myarray[0]} 
echo ${myarray[1]} 

Salva che a helloworld.bash

eseguire utilizzando . ./helloword.bash

+0

Non ha trovato quelli e per l'eco dice che è una "sostituzione cattiva" – Waffle

+0

hai qualche strana implementazione di bash? Come stai chiamando lo script? – Bryan

+1

Non credo di riuscirci. Io chiamo lo script dal terminale usando "sh votecalculations.sh" – Waffle

1

provare a rimuovere lo spazio:

candidate[1]=0 
candidate[2]=0 

e così via. Non sono un esperto in questo settore, ma penso che bash debba riconoscere l'intera espressione dell'assegnazione come una parola, quindi non puoi avere spazi in essa.

+0

votecalculation.sh: 13: candidato [1] = 0: non trovato votecalculation.sh: 14: candidato [2] = 0: non trovato votecalculation.sh: 15: candidato [3] = 0: non trovato Ho provato senza spazi e sopra è l'errore che ottengo quando non provo spazi. – Waffle

4

Probabilmente non piace lo spazio dopo il segno di uguale.

Alcune altre idee:

  • essere sicuri che si sta usando bash per eseguire lo script, e non SH/dash.

  • È possibile dichiarare esplicitamente una variabile di essere un array usando declare -a varname

+0

Si dice che declare non viene trovato quando provo a dichiarare l'array ... è così strano che il resto del programma venga eseguito dopo aver eliminato gli errori. – Waffle

+0

Sei sicuro di stare correndo? –

+0

A questo punto sono sicuro al 100% che sia dichiarato bash. – Waffle

1

Nel primo non ci devono essere spazi dopo i segni di uguale.

candidate[1]=0 
candidate[2]=0 
candidate[3]=0 

Il secondo sembra corretto. Sei sicuro che la tua shell sia bash? Prova ad aggiungere una vera e propria linea di hash-bang alla parte superiore dello script, se non lo avete già:

#!/bin/bash 
ARRAY=('can1' 'can2' 'can3') 
+0

Ho esattamente quell'hash-bang e ancora non funziona. Ho provato il codice sul mio Mac e sulla mia macchina Ubuntu. – Waffle

0

Se avete la faccenda corretta e chmod +x scriptname, non è necessario per avviare lo script utilizzando bash scriptname - si può semplicemente utilizzare ./scriptname o se la directory è in è nel vostro PATH, allora si può avviarlo utilizzando semplicemente scriptname.

Se si dispone di #!/bin/bash come sorgente e si esegue sh scriptname, lo shebang viene sovrascritto dalla scelta della shell sulla riga di comando.

Non c'è alcun significato speciale per avere .sh o .bash alla fine del nome file. È solo una questione di stile o di preferenza che piace ad alcune persone dal momento che ha lo scopo di indicare il tipo di script (ma solo per l'utente - non per il sistema).

2

Ho avuto lo stesso problema. Ho provato a chiamare il mio script con ./my_script.s, con. ./my_script.sh e ho anche provato con "bash my_script.sh" e "sh my_script.sh". Ho sempre avuto lo stesso messaggio: "my_array [1]: comando non trovato".

Poi ho visto il commento di Chris AtLee su bash non gradire lo spazio dopo il segno di uguale.

Le linee esatte nel mio codice prima

my_array[1] = 34 
my_array[2] = 57 

ho rimosso gli spazi prima e dopo i segni di uguale.

my_array[1]=34 
my_array[2]=57 

Quindi, ho semplicemente provato quanto segue nel terminale e non avevo più il messaggio di errore.

$ my_script.sh 

NOTE: Bash does not like spaces in variable definition !

Spero che questo aiuti altri principianti come me!

Problemi correlati