2015-05-17 27 views
5

Mam problem z moim skryptem bash. To, co robię, to przypisać takie zmienne.zadeklarować niepoprawny identyfikator bash

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

Działa, ale teraz mam problem z postaciami fińskimi, takimi jak å, ä, ö. Co zadeklarować mówi, że jest coś takiego

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

Choć to działa dobrze, jeśli mogę to zrobić tak

declare var2=$(sömething) 

mogę przekonwertować znaki z sed ale lepiej mieć je jak zawsze, więc jest to rozwiązanie w ostateczności. Więc chciałbym wiedzieć, w jaki sposób można przypisać zmienne jak

var$i 

z fińskim znaków. Słowo wörd jest częścią wyjścia mojego polecenia "coś". Gdy są dwa słowa lub więcej, tylko słowo (słowa), które zawierają znak ö, ä itd., Nie są przypisane do zmiennej, więc jeśli wyjście polecenia brzmi "coś z wami", to jedyna rzecz, która jest pokazywana z echo jest coś.

+1

Jak znaków fińskie pokazać się w '$ i' i dlaczego chcesz to zrobić? – Ryan

+0

Przypisuję wyjście o f niektóre polecenia do var1, var2, a następnie wykonaj obliczenia. Przepraszam, nie mówię o tym, co masz na myśli w pierwszej części. – jim

+1

Gdzie wchodzi 'wörd'? – Ryan

Odpowiedz

6

bash po prostu nie pozwala na identyfikatory używając znaków innych niż A-Z, a-z, 0-9 i _. Jednak błąd, który opisujesz, jest tylko skutkiem ubocznym tego ograniczenia. declare to polecenie, które pobiera argument, że wygląda jak instrukcja przypisania, ale semantyka są nieco inne. Rozważmy następujące polecenie:

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

w instrukcji przypisania, z boku po prawej stronie nie podlega podziałowi na słowa, więc nie trzeba zacytować podstawienia polecenia. Poniższe działa poprawnie:

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

Z declare jednak zastąpienie polecenia robi ulegają podziałowi na słowa, więc kiedy piszesz

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

jest odpowiednikiem polecenia

$ declare word3=something wörd 

który przekazuje dwie nazwy dla create, word3 (która otrzymuje wartość) i wörd (co jest nieprawidłową nazwą). declare word3="something wörd" będzie działać dobrze; dzielenie słowa powłoki jest już zrobione do czasu, gdy declare otrzyma argument.

W przypadku declare należy podać podstawienie polecenia (lub cały ciąg), aby całe wyjście było traktowane jako wartość nowej zmiennej.

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

Informacja o ograniczeniu identyfikatorów bash do "[A-Za-z _] [A-Za-z0-9 _] *" nie jest prawdą. Bash pozwala na rozpoczęcie identyfikatora od dowolnego znaku jednobajtowego, który 'isalpha' w bieżącym locale, i do kontynuowania z dowolnym znakiem jest' isalnum'. Jeśli locale to iso-8859-1, litery alfabetu skandynawskiego, francuskiego, portugalskiego i hiszpańskiego działałyby dobrze. Jednak nie będzie działać z ustawieniami UTF-8, ponieważ znaki alfabetu nie-nas-ascii są wielobajtowe. – rici

+0

Dzięki. Wiedziałem, że podczas pisania tej części odpowiedzi brzmiało to zbyt niepotrzebnie, ale postanowiłem przetestować to ustawienie w języku innym niż angielski. – chepner

+0

Nie jest łatwo przetestować, ponieważ większość systemów używa w tym czasie wejść/wyjść konsoli UTF-8, nawet jeśli ustawienia regionalne zostały zmienione. Musisz więc utworzyć plik ISO-8859-1, a także ustawić ustawienia regionalne. Ale działa, szczerze. (I Posix również to wymaga.) – rici

0

Spróbuj uruchomić skrypt przy użyciu /bin/bash w wierszu poleceń zamiast jeśli sh (:

Zamiast:

>> sh script.sh 

Spróbuj:

>> /bin/bash script.sh 
Powiązane problemy