2015-05-17 12 views
5

Ho un problema con il mio uno script bash. Quello che faccio è assegnare variabili come questa.dichiarare non un identificatore valido bash

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

e funziona, ma ora ho un problema con i caratteri finlandesi come un, ä, ö. Che dichiarare dice è qualcosa di simile

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

Anche se funziona bene se lo faccio come questo

declare var2=$(sömething) 

posso convertire i caratteri con sed ma è meglio averli come sempre, quindi questo è una soluzione di ultima istanza. quindi vorrei sapere come posso assegnare le variabili come

var$i 

con i personaggi finlandesi. La parola parola è parte dell'output del mio comando 'qualcosa'. Quando ci sono due parole o più solo le parole che contengono il carattere ö, ä e così via non sono assegnate alla variabile, quindi se l'output del comando era "qualcosa wörd", allora l'unica cosa che viene mostrata con l'eco è qualcosa.

+1

Come caratteri finlandesi mostrano in '$ i', e perché vuoi farlo? – Ryan

+0

Assegno l'output o f alcuni comandi a var1, var2 e quindi calcoli. Mi spiace di non aver capito cosa intendi nella prima parte. – jim

+1

Dove entra in gioco 'wörd'? – Ryan

risposta

6

bash semplicemente non consente identificatori utilizzando caratteri diversi da A-Z, a-z, 0-9 e _. Tuttavia, l'errore che descrivi è solo un effetto collaterale di tale limitazione. declare è un comando che accetta un argomento stringa che sembra come un'istruzione di assegnazione, ma la semantica è leggermente diversa. Considerate questo comando:

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

In un'istruzione di assegnazione, il lato destro non subire la suddivisione delle parole, quindi non c'è bisogno di citare la sostituzione di comando. Le seguenti opere di bene:

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

Con declare, tuttavia, il comando di sostituzione fa subiscono la suddivisione delle parole, in modo che quando si scrive

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

è equivalente al comando

$ declare word3=something wörd 

che passa due nomi per declare a creare, word3 (che ottiene un valore) e wörd (che è un nome non valido). declare word3="something wörd" funzionerebbe correttamente; la suddivisione in parole della shell è già fatta entro il tempo declare ottiene l'argomento.

Con declare, quindi, è necessario citare la sostituzione di comando (o l'intera stringa) in modo che l'intero output venga considerato come il valore per la nuova variabile.

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

L'affermazione relativa agli identificatori di bash limitati a '[A-Za-z _] [A-Za-z0-9 _] *' non è vera. Bash consente a un identificatore di iniziare con qualsiasi carattere a byte singolo che 'isalpha' nel locale corrente, e di continuare con qualsiasi carattere è' isalnum'. Se le impostazioni internazionali fossero iso-8859-1, le lettere alfabetiche scandinave, francesi, portoghesi e spagnole funzionerebbero perfettamente. Tuttavia, non funzionerà con le versioni locali di UTF-8 perché i caratteri alfabetici non-us-ascii sono multibyte. – rici

+0

Grazie. Sapevo che mentre scrivevo quella parte della risposta suonava inutilmente severa, ma pensavo di provarla con una versione non inglese. – chepner

+0

Non è nemmeno facile da testare, dato che la maggior parte dei sistemi attualmente utilizza I/O della console UTF-8, anche se le impostazioni internazionali sono state modificate. Quindi devi creare un file ISO-8859-1 e impostare le impostazioni locali. Ma funziona, onesto. (E Posix richiede che funzioni anche lui.) – rici

0

provare ad eseguire lo script utilizzando /bin/bash a riga di comando, invece, se sh (:

Invece di:

>> sh script.sh 

Prova:

>> /bin/bash script.sh 
Problemi correlati