Ich kann keine -
Variablen in der Shell verwenden. Gibt es eine Möglichkeit, es zu verwenden, da ich ein Skript habe, das von solchen benannten Variablen abhängt:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Erstens wirft der angegebene Fehler und zweitens funktioniert gut.
Antworten:
Ich habe noch nie eine Bourne-artige Shell getroffen, die
-
einen Variablennamen zulässt. Es werden nur ASCII-Buchstaben (in beiden Fällen)_
und Ziffern unterstützt, und das erste Zeichen darf keine Ziffer sein.Wenn Sie ein Programm haben, für das eine Umgebungsvariable erforderlich ist, die nicht den Shell-Einschränkungen entspricht, starten Sie es mit dem
env
Programm.Beachten Sie, dass einige Shells (z. B. moderner Bindestrich , mksh, zsh) Variablen, deren Namen sie nicht mögen, aus der Umgebung entfernen. ( Shellshock hat dazu geführt, dass die Leute bei Umgebungsvariablennamen vorsichtiger sind. Daher werden die Einschränkungen mit der Zeit wahrscheinlich strenger und nicht zulässiger.) Wenn Sie also eine Variable übergeben müssen, deren Name Sonderzeichen enthält, übergeben Sie sie direkt an ein Programm. ohne eine Shell dazwischen (
env 'strange-name=some value' sh -c'…; myprogram'
kann oder kann nicht funktionieren).quelle
env
Sie auf welchem Betriebssystem verwendet haben.)env
voncoreutils
,sh
vondash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
funktioniert aberenv 'with-dashes=value' sh -c 'env | fgrep dashes'
druckt nichts. Das heißt,env
selbst ist in Ordnung, aber Dash scheint diese Variablen spezifisch zu blockieren. Wenn also das betreffende Programm über einen Shell-Wrapper mit einem typischen#!/bin/sh
Header gestartet wird , gibt es keine offensichtliche Möglichkeit, solche Variablen weiterzugeben. Beispiel Workaroundenv
näher an der aufrufenden Site des Programms, das diesen Variablennamen benötigt, eine Shell dazwischen verwenden. Dash ist nicht der Einzige, der Variablen entfernt, deren Name ihm nicht gefällt.In Bash ist das nicht möglich.
Im Abschnitt " Definitionen " auf der Handbuchseite von
bash
:Aus dem Abschnitt Parameter in der Handbuchseite von
bash
:quelle
Sie können über eine indirekte Referenz auf eine mit Bindestrich versehene Variable zugreifen.
quelle
Wenn Ihr Skript davon abhängt, dass Variablennamen Bindestriche enthalten, liegt ein Programmierfehler vor. Wenn es für Sie aufgrund der Tools, die Sie regelmäßig verwenden, um die Variablennamen mit einem Bindestrich zu versehen, praktisch ist, müssen Sie möglicherweise mehr und andere Tools lernen.
Haben Sie versucht , die Bindestriche mit tr in Unterstriche umzuwandeln?
Bash erlaubt das Auftauchen von '-' in Funktionsnamen. Ich mache das die ganze Zeit. Beispielsweise:
quelle
Das Bindestrich (
-
) -Zeichen ist ein Umbruchzeichen und als Teil von Variablennamen nicht zulässig. Es gibt Möglichkeiten, dies mit zitierten Variablen zu hacken, aber das Parsen ist wirklich problematisch. Es gibt auch andere Zeichen mit besonderer Bedeutung im Zusammenhang mit Variablennamen in Bash, insbesondere geschweifte Klammern, Klammern, Operatorzeichen und Anführungszeichen. (zB{}()=+-&'"
und mehr)Ich würde vorschlagen, dass Sie praktisch ein anderes Paradigma finden müssen, auf dem Sie Ihr Skript aufbauen können. Möglicherweise haben Sie eine Ahnung von anderen Sprachen über "variable Variablennamen". In Shell-Skripten ist dies im Allgemeinen keine gute Idee.
Wenn Sie dies bearbeiten oder eine neue Frage mit Details zu Ihrem Kontext und dem, was Sie erreichen möchten, stellen, können wir möglicherweise eine gute Methode für die Skripterstellung vorschlagen.
quelle
Das Bash-Handbuch definiert einen "Namen" als:
Sie können also keinen Bindestrich in einem Namen verwenden.
quelle
Die meisten Shells unterstützen nur az, AZ, 0-9 und _ für Variablennamen. Lesen Sie den zweiten Punkt auf dieser Seite .
quelle
Sie können mit env und sed spielen.
Als Beispiel musste ich diese Variable 'ELASTICSEARCH_CLUSTER-NODES' lesen.
Der Befehl env gibt Folgendes aus:
So extrahieren Sie die Variable:
quelle
Ich glaube, dass nur Buchstaben, Zahlen und Unterstriche für Bash-Variablen zulässig sind. Dies ist in vielen Programmiersprachen der Fall (Javascript ist eine Ausnahme).
Ich empfehle, Ihr Skript nicht von solchen Variablennamen abhängig zu machen.
In der Tat sollten Sie versuchen, so zu programmieren, dass Sie Variablennamen durch andere Namen ersetzen können, und es macht keinen Unterschied. Im Allgemeinen sollten Variablennamen beschreiben, was die Variable enthält. Dies erleichtert das Debuggen erheblich. Wenn nicht für Sie, dann für den nächsten Entwickler, der versucht, den Code herauszufinden.
quelle
Mit dem
env
Befehl können Sie Umgebungsvariablen mit den Zeichen "-" setzen und entfernen.So legen Sie müssen Ihren Befehl env auszuführen:
env command
. Sie übergeben Variablen folgendermaßen:Sehen Sie, wie es funktioniert mit:
oder um es klarer zu machen:
quelle