variable bash variables for-loop sed declare

bash sed on variable



declarar no un identificador vĂ¡lido bash (2)

Tengo un problema con mi script bash. Lo que hago es asignar variables como esta.

for ((i=START;i<=END;i++) declare var$i=$(something) done

Y funciona, pero ahora tengo un problema con los caracteres finlandeses como å, ä, ö. Lo que declara dice es algo como esto

bash:declare ''wörd'' not a valid identifier

Aunque funciona bien si lo hago así

declare var2=$(sömething)

Puedo convertir los caracteres con sed, pero es mejor tenerlos como siempre, así que esta es una solución de último recurso. Entonces me gustaría saber cómo puedo asignar variables como

var$i

con los caracteres finlandeses. La palabra wörd es parte de la salida de mi comando ''algo''. Cuando hay dos palabras o más, solo las palabras que contienen el carácter ö, ä y así sucesivamente no se asignan a la variable, por lo que si la salida del comando fue "algo wörd", entonces lo único que se muestra con echo es algo.


bash simplemente no permite identificadores que usan caracteres distintos de AZ, az, 0-9 y _. Sin embargo, el error que describes es solo un efecto secundario de esa limitación. declare es un comando que toma un argumento de cadena que se parece a una instrucción de asignación, pero la semántica es ligeramente diferente. Considera este comando:

foo () { echo "something wörd" }

En una declaración de asignación, el lado derecho no sufre división de palabra, por lo que no tiene que citar la sustitución de comando. Lo siguiente funciona bien:

$ word3=$(foo) $ echo "$word" something wörd

Con declare , sin embargo, la sustitución del comando sufre división de palabras, por lo que cuando escribe

$ i=3 $ declare word$i=$(foo)

es equivalente al comando

$ declare word3=something wörd

que pasa dos nombres para declare crear, word3 (que obtiene un valor) y wörd (que es un nombre inválido). declare word3="something wörd" funcionaría bien; la separación de palabras de la caparazón ya está hecha para cuando declare obtiene el argumento.

Con declare , entonces, debe citar la sustitución de comando (o la cadena completa) para que la salida completa se trate como el valor de la nueva variable.

$ i=3 $ declare "word$i=$(foo)" $ echo "$word3" something wörd


Intente ejecutar su script usando /bin/bash en la línea de comando si sh (:

En lugar de :

>> sh script.sh

Tratar :

>> /bin/bash script.sh