Je ne suis pas capable d'utiliser des -
variables en shell. Est-il possible de l'utiliser, car j'ai un script qui dépend de telles variables nommées:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Le premier lance l'erreur donnée et le second fonctionne très bien.
Réponses:
Je n'ai jamais rencontré de shell Bourne-style permettant
-
un nom de variable. Seules les lettres ASCII (de chaque cas)_
et les chiffres sont pris en charge, et le premier caractère ne doit pas être un chiffre.Si vous avez un programme nécessitant une variable d'environnement ne correspondant pas aux restrictions du shell, lancez-le avec le
env
programme.Notez que certains shells (par exemple , dash moderne , mksh, zsh) suppriment les variables dont ils n'aiment pas le nom, dans l'environnement. ( Shellshock a amené les gens à être plus prudents à propos des noms de variables d'environnement, de sorte que les restrictions vont probablement devenir plus strictes avec le temps, pas plus permissives.) Donc, si vous devez transmettre une variable dont le nom contient un caractère spécial à un programme, transmettez-la directement, sans coquille entre les deux (
env 'strange-name=some value' sh -c'…; myprogram'
peut ou peut ne pas fonctionner).la source
env
vous avez utilisée sur quel système d'exploitation.)env
decoreutils
, àsh
partir dedash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
fonctionne maisenv 'with-dashes=value' sh -c 'env | fgrep dashes'
n'imprime rien. Enenv
soi, c’est bien, mais Dash semble bloquer spécifiquement ces variables. Ainsi, si le programme en question est lancé via un wrapper shell avec un en-#!/bin/sh
tête typique , il n’existe aucun moyen apparent de transmettre de telles variables. Exemple de solution de contournementenv
plus près du site appelant du programme qui a besoin de ce nom de variable, sans un shell entre les deux. Dash n'est pas le seul à supprimer les variables dont il n'aime pas le nom.Ce n'est pas possible dans Bash.
À partir de la section Définitions de la page de manuel de
bash
:Dans la section Paramètres de la page de manuel de
bash
:la source
Vous pouvez accéder à une variable avec un trait d'union à l'aide d'une référence indirecte.
la source
Si votre script dépend de la présence de traits d'union dans les noms de variables, c'est une erreur de programmation. Si cela vous convient à cause des outils que vous utilisez régulièrement pour que les noms de variables contiennent un trait d'union, vous devrez peut-être en apprendre davantage et utiliser différents outils.
Avez-vous essayé d'utiliser tr pour convertir les traits d'union en traits de soulignement?
Bash permet à "-" d'apparaître dans les noms de fonctions. Je fais ça tout le temps. Par exemple:
la source
Le caractère tiret (
-
) est un caractère d'interruption et n'est pas autorisé dans les noms de variables. Il existe des moyens de pirater ceci avec des variables citées, mais son analyse est vraiment problématique. Il existe également d'autres caractères ayant des significations spéciales dans le contexte des noms de variables de bash, notamment les accolades, les parenthèses, les caractères d'opérateur et les guillemets. (par exemple{}()=+-&'"
et plus)Je suggérerais que pratiquement vous devez trouver un autre paradigme sur lequel construire votre script. Vous pourriez avoir une idée en suspens d'autres langages sur les "noms de variables variables". Ce n'est généralement pas une bonne idée dans les scripts shell.
Si vous modifiez ceci ou posez une nouvelle question avec des détails sur votre contexte et ce que vous essayez d'accomplir, nous pourrons peut-être vous proposer un bon moyen de le scripter.
la source
Le manuel de Bash définit un "nom" comme:
Donc, vous ne pouvez pas utiliser un trait d'union dans un nom.
la source
La plupart des shells ne prennent en charge que az, AZ, 0-9 et _ pour variablenames. Lire le deuxième élément de cette page .
la source
Vous pouvez jouer avec env et sed.
Par exemple, j'avais besoin de lire cette variable 'ELASTICSEARCH_CLUSTER-NODES'.
La commande env affiche ceci:
Donc pour extraire la variable:
la source
Je crois que seules les lettres, les chiffres et les traits de soulignement sont autorisés pour les variables bash. C'est le cas dans de nombreux langages de programmation (javascript étant une exception).
Je recommande de ne pas avoir votre script dépend de ces types de noms de variables.
En fait, vous devriez essayer de programmer de manière à pouvoir remplacer les noms de variables par d'autres noms et cela ne changera rien. En général, les noms de variables doivent décrire ce que contient la variable. Cela facilite beaucoup le débogage; sinon pour vous, puis pour le prochain développeur qui essaie de comprendre le code.
la source
Vous pouvez utiliser la
env
commande pour définir et annuler les variables d'environnement avec hiphens "-".Pour définir vous devez utiliser env pour exécuter votre commande:
env command
. Vous passez les variables de cette façon:Voyez-le travailler avec:
ou pour le rendre plus clair:
la source