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