2010-05-06 17 views
7

Estoy tratando de declarar una matriz en bash, pero cuando se ejecuta el código dice que no puede encontrar la matriz. Intenté escribir la declaración de la matriz de diferentes maneras, pero parece que no importa cómo intente declararla, no puedo hacer que funcione. Principio intenté para declarar como tal:Matriz en Bash no encontrada

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

Los mensajes de error que se devuelven son:

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

Después de esto he intentado otra solución que encontré en línea:

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

Cuando eso se utiliza, devuelve este error:

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

Soy nuevo en Bash y estoy realmente confundido acerca de las matrices. ¿Hay alguna forma específica en la que necesito declarar una matriz o simplemente lo estoy haciendo completamente mal?

+0

Ok, así que al final descubrí el problema. Aunque el encabezado del archivo era #!/Bin/bash, el nombre del archivo terminaba con .sh. Después de cambiar la extensión del archivo a .bash y ejecutarlo usando "bash votecalculations.bash" en el terminal, funciona. ¡Gracias de nuevo a todos por su ayuda! – Waffle

+1

FYI la extensión de archivo no importa ... puede dejarla como '.sh' o incluso no tener ninguna extensión de archivo, siempre y cuando la ejecute con bash. –

Respuesta

4
#!/bin/bash 

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

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

salvo que a helloworld.bash

EJECUTAR usando . ./helloword.bash

+0

No los encontró y por el eco dice que es una "mala sustitución" – Waffle

+0

¿Tiene alguna aplicación extraña de bash? ¿Cómo llamas el guión? – Bryan

+1

No creo que lo haga. Llamo al script desde la terminal usando "sh votecalculations.sh" – Waffle

1

intente eliminar el espacio:

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

y así sucesivamente. No soy un experto en esta área, pero creo que bash necesita reconocer toda la expresión de asignación como una sola palabra, por lo que no puedes tener espacios en ella.

+0

votecalculation.sh: 13: candidato [1] = 0: No encontrado votecalculation.sh: 14: candidato [2] = 0: no encontrado votecalculation.sh: 15: candidato [3] = 0: No encontrado Lo he intentado sin espacios y arriba está el error que recibo cuando intento no espacios. – Waffle

4

Probablemente no le gusta el espacio después del signo igual.

Algunas otras ideas:

  • estar seguro de que en realidad estás usando bash para ejecutar la secuencia de comandos, y no sh/Dash.

  • Se puede declarar explícitamente una variable a ser un array usando declare -a varname

+0

Dice que declare no se encuentra cuando intento declarar la matriz ... es tan extraño que el resto del programa se ejecute después de eliminar los errores. – Waffle

+0

¿Estás seguro de que estás ejecutando bash? –

+0

En este punto, estoy 100% seguro de que está declarado como bash. – Waffle

1

En el primero no debe haber espacios entre los signos iguales.

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

El segundo parece correcto. ¿Estás seguro de que tu caparazón es bash? Trate de añadir una línea de hash-bang adecuada a la parte superior de la secuencia de comandos si no lo tiene:

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

Tengo ese hash-bang exacto y todavía no funciona. Probé el código en mi Mac y en mi máquina Ubuntu. – Waffle

0

Si tiene el tinglado correcta y que chmod +x scriptname, no es necesario para iniciar el script usando bash scriptname - sólo puede utilizar ./scriptname o si el directorio está en está en su PATH, entonces se puede empiece usando simplemente scriptname.

Si tiene #!/bin/bash como su shebang y ejecuta sh scriptname, entonces el shebang se reemplaza por la opción de shell en la línea de comandos.

No hay un significado especial para tener .sh o .bash al final del nombre del archivo. Es solo cuestión de estilo o preferencia lo que a algunas personas les gusta ya que su intención es indicar el tipo de script (pero solo para el usuario, no para el sistema).

2

Tuve el mismo problema. Intenté llamar a mi script con ./my_script.s, con. ./my_script.sh y también probé con "bash my_script.sh" y "sh my_script.sh". Siempre recibí el mismo mensaje: "my_array [1]: comando no encontrado".

Luego vi el comentario de Chris AtLee acerca de que bash no le gustaba el espacio después del signo igual.

Las líneas exactas en mi código antes

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

Quité los espacios antes y después de los signos igual.

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

Luego, simplemente intenté lo siguiente en el terminal y ya no recibí el mensaje de error.

$ my_script.sh 

NOTE: Bash does not like spaces in variable definition !

Esperanza esto ayuda a otros principiantes como yo!