0
votes

Utilisation de la valeur dans une variable sans expansion

J'essaie de trouver et de remplacer un contenu de texte spécifique à l'aide de la commande SED et de l'exécuter via un script shell.

ci-dessous est le script d'échantillon que j'utilise: xxx

et exécuter la même chose en passant les arguments: xxx

mais si la chaîne d'argument contient $ , il enfreint les commandes et elle remplace par des valeurs incorrectes, comme xxx

Comment puis-je vous assurer que les valeurs à l'intérieur des variables ne sont pas développées en raison du $ ?

mise à jour

sh fichier test.sh xxx

fichier texte fichier nom_txt xxx

sorties

1) ./test.sh upd up upd upon world xxx

2) ./test.sh upd upd upd hello '$ APR1 $ hosgaxyv $ d0kxp5dcyz2buycs9bmhu1' xxx

dans les deux cas, il ne remplace pas le contenu


5 commentaires

Pourquoi avez-vous besoin eval du tout?


@Benjaminw. Je pensais que c'est le moyen d'exécuter les commandes dynamiques. Havent a utilisé des scripts jusqu'à présent. Et je ne connais même pas les bases de celui-ci. Donc je suis toutes les oreilles


Qu'est-ce que fileename.txt ressemble, et pourquoi n'est-ce pas simplement un fichier de définitions de fonction que vous pouvez provenir, de sorte que vous puissiez appeler la fonction appropriée au lieu d'utiliser eval ?


@cheppner C'est le fichier htpasswd avec nom d'utilisateur et mot de passe cryptés


Désolé, j'ai mal interprété la mission; Je pensais que vous essayiez d'exécuter le résultat de sed en tant que commande.


3 Réponses :


0
votes

Mettez les arguments de ligne de commande qui sont des noms de fichiers en guillemets simples: xxx


1 commentaires

L'évaluation stupide empêche probablement cela de travailler, de sorte que ce n'est pas suffisant.



2
votes

Vous n'avez pas besoin eval code> ici du tout: xxx pré>

  • La commande SED complète est dans des guillemets doubles afin que les variables puissent se développer. Li>
  • J'ai remplacé le séparateur vide en tant que séparateur S code> avec / code> (ne comporte pas vraiment dans l'exemple). LI>
  • J'ai utilisé \ 1 code> pour référencer le premier groupe de capture au lieu de répéter la variable dans la substitution. LI>
  • surtout, j'ai utilisé $ {2 // '$' / '\ $'} code> au lieu de 2 $ code> (et similaire pour $ 3 ). Cela échappe à tous les $ code> comme \ $ code>; Ceci est nécessaire en raison de la cotisation double, ou du code> se faire manger par la coque avant que SED ne cesse de les voir. Li> ul>

    Lorsque vous appelez votre script, vous devez échapper à tout $ code> dans l'entrée ou si la coquille tente de les développer en tant que noms variables: P>

    ./test.sh update asd '$apr1$HnIF6bOt$9m3NzAwr.aG1Yp.t.bpIS1.'
    


11 commentaires

Mais quand je déclenche la même chose avec $ APR1 $ hnif6bot $ 9m3nzawr.ag1yp.t.bpis1. En tant que 3ème argument, son remplaçant de la chaîne après la dernière «$» .. Ie 'm3nzawr.ag1yyp.t.bpis1'


J'utilisais en blanc comme séparateur S parce que ma chaîne peut avoir "/" dans la valeur.


@Andromeda Vous devez également devoir citer $ lorsque vous appelez votre commande, j'ai ajouté un exemple d'utilisation.


sa ne fonctionne pas pour moi ... J'ai même essayé avec des intrants qui n'ont pas de $ .. Son ne remplace pas le contenu


@Andromeda êtes-vous sur MacOS, par hasard?


Non..Je avez la machine Windows connectée à mon serveur Linux via SSH.


@Andromeda Essayez d'ajouter SET -VX à votre script pour voir ce qui est exécuté exactement.


@Andromeda Utilisez -I -E au lieu de --ieieie , je l'ai eu mal au début de ma réponse.


Oui. Je n'ai même pas manqué que lorsque je le colle en collé. Maintenant, il remplaçant les intérêts. Mais avec quelques citations supplémentaires pour chaque $ au lieu de $ APR1 $ HNIF6BOT $ 9m3nzawr.ag1yP.t.bpis1 Il remplace avec '$' APR1 'APR1' $ 'hnif6bot' $ '9m3nzawr.ag1yp.t.bpis1


Non seulement cela ..Si ma chaîne contient '/', ce n'est pas là dans la sortie. (La raison pour laquelle j'utilisais vide en tant que sépérateur pour S


Suppression des devis simples et fonctionnent comme prévu SED -I -E "S ($ {2 // //$/\$ =).* \ 1: $ {3 // $ / \ $} g" "



0
votes

doit protéger tous les arguments de script avec des guillemets si vous disposez d'espace et de shell spécial, et de l'échapper s'il s'agit d'un dollar $ et -ei au lieu de -ie même Mieux vaut tomber en premier pour le test, peut l'ajouter plus tard si vous êtes vraiment sûr de
J'admets que je ne voudrais pas dire à votre regex alors allons simplement entrer dans le gist de solution, pas besoin d'eval; xxx


0 commentaires