7
votes

Comment évaluer les variables Shell dans une chaîne?

dans mon script Perl, je reçois des chaînes de chemins de fichiers pouvant contenir des variables d'environnement, par exemple. $ polices / test.ttff code> ou $ tmp / fichier.txt code>.

Je veux maintenant ouvrir ces fichiers tels que ceci: p>

open my $handle, "<$filename" or die $!;


2 commentaires

Vous voulez vraiment utiliser un 3 arg ouvert ici pour éviter une vulnérabilité de sécurité.


Peut aussi bien fournir des liens: Stackoverflow.com/Questtions/318789/... Stackoverflow.com/questions/1479741/...


4 Réponses :


13
votes

Si les variables environnementales sont définies, vous pouvez utiliser une simple substitution: xxx


3 commentaires

Neat et succinct - et, comme toujours, le traitement des erreurs le fera bu. Spécifiquement, si l'une des variables d'environnement référencées n'est pas définie, vous obtiendrez au mieux un chemin imprévu. Vous pouvez également obtenir des avertissements sur l'accès à des variables non définies de Perl. Bien qu'il existe d'autres notations shell (comme $ {tmp} ), ils sont rarement utilisés dans des contextes où cela posera un problème.


@Jonathan, le comportement standard pour bash consiste à substituer la chaîne vide pour une variable manquante, ce code gère donc cette condition d'erreur de la manière dont l'OP a demandé. Je suis d'accord sur les notations de rechange alternatives que j'utilise $ {foo:?} beaucoup dans les scripts pour forcer bash pour lancer des erreurs sur des variables non définies.


J'ai mis à jour cela sur S / \ $ \ \ {? (\ W +) \ \}? / $ Env.



0
votes

Eh bien, ce qui suit est considérablement plus verbeux, mais il Semble de gérer correctement les deux $ foo et $ {foo} syntaxe. xxx

voici un échantillon d'exécution ... xxx

dans cette version, les symboles non définis sont remplacés par une chaîne vide, comme la coquille. Mais dans mes applications, je préférerais laisser le non expandiné Symbole non valide en place, ce qui facilite la voir ce qui s'est mal passé. En outre, si vous bousillez votre support correspondant, la coquille sera vous donner une erreur "mauvaise substitution", mais ici nous allons juste revenir la corde avec le symbole cassé toujours en place.


0 commentaires

0
votes

Désolé, mais vous avez tort.

travailler dans Perl avec des variables de shell, la syntaxe correcte est la suivante: $ env (variable}

Exemple avec une fonction de sortie GCC colorée: < Pré> xxx


0 commentaires

3
votes

Pourquoi ne pas simplement faire cela:

$filename =~ s/\$\{(\w+)\}/$ENV{$1}/g;
$filename =~ s/\$(\w+)/$ENV{$1}/g;


0 commentaires