Nie jestem w stanie używać -
zmiennych w powłoce. Czy istnieje sposób, aby móc go używać, ponieważ mam jeden skrypt, który zależy od takich nazwanych zmiennych:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Pierwszy rzuca podany błąd, a drugi działa dobrze.
Odpowiedzi:
Nigdy nie spotkałem powłoki w stylu Bourne'a, która dopuszczała
-
zmienną nazwę._
Obsługiwane są tylko litery ASCII (w obu przypadkach) i cyfry, a pierwszy znak nie może być cyfrą.Jeśli masz program, który wymaga zmiennej środowiskowej, która nie odpowiada ograniczeniom powłoki, uruchom ją z
env
programem.Zauważ, że niektóre powłoki (np. Nowoczesne myślniki , mksh, zsh) usuwają zmienne, których nazw nie lubią ze środowiska. ( Shellshock spowodował, że ludzie są bardziej ostrożni w kwestii nazw zmiennych środowiskowych, więc ograniczenia mogą z czasem stać się bardziej rygorystyczne, a nie bardziej liberalne.) Jeśli więc chcesz przekazać zmienną, której nazwa zawiera znak specjalny do programu, przekaż ją bezpośrednio, bez powłoki pośredniej (
env 'strange-name=some value' sh -c'…; myprogram'
może lub nie może działać).źródło
env
użyta w jakim systemie operacyjnym.)env
odcoreutils
,sh
zdash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
działa, aleenv 'with-dashes=value' sh -c 'env | fgrep dashes'
nic nie drukuje. To znaczy,env
samo w sobie jest w porządku, ale Dash wydaje się specjalnie blokować te zmienne. Zatem jeśli dany program jest uruchamiany przez opakowanie powłoki z typowym#!/bin/sh
nagłówkiem, nie ma widocznego sposobu na przekazanie takich zmiennych. przykładowe obejścieenv
bliżej strony wywołującej programu, która potrzebuje tej nazwy zmiennej, bez powłoki między nimi. Dash nie jest sam w usuwaniu zmiennych, których nazwom się nie podoba.W Bash nie jest to możliwe.
Z sekcji Definicje na stronie podręcznika
bash
:Z sekcji Parametry na stronie podręcznika
bash
:źródło
Możesz uzyskać dostęp do zmiennej dzielonej za pomocą odwołania pośredniego.
źródło
Jeśli twój skrypt zależy od tego, czy nazwy zmiennych mają łączniki, jest to błąd programowania. Jeśli jest to dla ciebie wygodne ze względu na narzędzia, których regularnie używasz, aby nazwy zmiennych zawierały myślnik, być może będziesz musiał nauczyć się więcej i różnych narzędzi.
Czy próbowałeś użyć tr do konwersji myślników na podkreślenia?
Bash pozwala na pojawienie się „-” w nazwach funkcji. Robię to cały czas. Na przykład:
źródło
Znak dash (
-
) jest znakiem przerwania i nie jest dozwolony jako część nazw zmiennych. Istnieją sposoby na zhackowanie tego przy użyciu zmiennych cytowanych, ale ich analiza jest naprawdę problematyczna. Istnieją również inne znaki o specjalnym znaczeniu w kontekście nazw zmiennych w bash, w szczególności nawiasy klamrowe, nawiasy, znaki operatora i cudzysłowy. (np.{}()=+-&'"
i więcej)Sugerowałbym, że praktycznie musisz znaleźć inny paradygmat, na którym zbudujesz swój skrypt. Być może wiesz z innych języków o „nazwach zmiennych zmiennych”. Zasadniczo nie jest to dobry pomysł w skryptach powłoki.
Jeśli edytujesz to lub zadajesz nowe pytanie ze szczegółami swojego kontekstu i tego, co próbujesz osiągnąć, możemy zaproponować dobry sposób na napisanie skryptu.
źródło
Podręcznik Bash definiuje „nazwę” jako:
Nie możesz więc używać myślnika w nazwie.
źródło
Większość powłok obsługuje tylko zmienne az, AZ, 0-9 i _ dla nazw zmiennych. Przeczytaj drugi element na tej stronie .
źródło
Możesz grać z env i sed.
Jako przykład musiałem odczytać zmienną „ELASTICSEARCH_CLUSTER-NODES”.
Komenda env wyświetla następujące dane:
Aby wyodrębnić zmienną:
źródło
Uważam, że w przypadku zmiennych bash dozwolone są tylko litery, cyfry i podkreślniki. Dotyczy to wielu języków programowania (wyjątek stanowi javascript).
Zalecam, aby skrypt nie był zależny od tego rodzaju nazw zmiennych.
W rzeczywistości powinieneś spróbować zaprogramować w taki sposób, aby zastąpić nazwy zmiennych innymi nazwami i to nie robi różnicy. Ogólnie nazwy zmiennych powinny opisywać, co zawiera zmienna. To znacznie ułatwia debugowanie; jeśli nie dla ciebie, to dla następnego programisty, który próbuje znaleźć kod.
źródło
Za pomocą tego
env
polecenia można ustawiać i wyłączać zmienne środowiskowe za pomocą łączników „-”.Aby ustawić należy użyć env uruchomić polecenie:
env command
. Przekazujesz zmienne w ten sposób:Zobacz, jak działa z:
lub dla uproszczenia:
źródło