0
votes

Bash: Prendre une faute de caractères génériques d'un script shell et être capable de l'étendre

Je suis confronté à un problème spécifique qui est à première vue facile.

Si je tape mon coquille Bash, la carte générique correspondant à différents fichiers: xxx

et faire après: xxx

i obtenir la liste de tous les fichiers correspondant à la carte générique, c'est-à-dire: xxx

mais maintenant, je Voudrais rendre la sonde wildcard _ *. txt comme argument 2 $ dans une fonction.

pour le moment, si je le fais dans une fonction Bash : xxx

puis, à l'exécution suivante:

$ multiple_files. $ myfile dir /

Puis je n'obtiens que le premier nom de fichier probe_gcph.txt qui est imprimé pour le troisième écho ( echo $ myfile ) Dans la définition de la fonction Bash.

Comment puis-je transmettre un nom générique de fichiers comme argument (ici 2 $) et peut être capable après l'agrandir pour répertorier tous les noms de fichiers correspondant à une fonction Bash? < / p>

Il semble y avoir un conflit entre l'argument $ 2 qui prend en compte uniquement les premiers fichiers expansés qui sont sonde_gcph.txt et le passage d'une faute de caractères génériques comme argument 2 $ sans l'élargir.

Comment contourner ce problème?


1 commentaires

Citez votre faune sauvage?


3 Réponses :


1
votes

Double citations Évitez d'élargir la coque globe, mais permettez toujours de remplacer la variable de coque. Il vaut la peine de noter que les citations simples empêchent toutes les deux glob (ou des expansions génériques telles que des interpolations variables.

TL; DR: P>

Appelez votre fonction de cette façon: P>

multiple_files . "$myfile" dir/


0 commentaires

1
votes

Pour réussir Wildcard à l'intérieur de la fonction, vous aurez besoin d'échapper au caractère spécial ou d'inclure la séquence générique dans des guillemets.

$ function multiple_files { myfile=$2; echo $1; eval echo "$2"; echo "$2"; echo "$myfile"; eval echo "$myfile";}
$ multiple_files '*' f\*
f1 f2 f3
f1 f2 f3
f*
f*
f1 f2 f3


2 commentaires

Voir wiki.bash-hackers.org/scripting/obsolete RE: Déclaration de fonction hérité ksh Syntaxe (en particulier l'entrée dans la dernière table).


... et Re: Utilisation suggérée de EVAL pour effectuer une expansion Glob, on peut simplement laisser des guillemets sur une expansion de paramètre (éventuellement avec ifs effacé pour éviter la fractionnement de la chaîne ) Pour effectuer le globe global, sans avoir un $ (rm -rf ~) sous-chaîne de vos données traitées comme une commande. Bashfaq # 48 est pertinent.



2
votes

Écrivez votre fonction pour accepter plusieurs arguments au lieu d'un seul. C'est la façon dont la plupart des autres outils fonctionnent (CP / MV / LS / GREP / SED à nommer quelques-uns):

The first thing was .
The last  thing was dir/
One of the files is probe_GCph.txt
One of the files is probe_GCsp.txt
One of the files is probe_GCsp_WL_GCph.txt
One of the files is probe_GCsp_XC.txt


4 commentaires

Merci pour votre réponse. Dans mon exemple, affiché dans la question originale, cela fonctionne parfaitement. Malheureusement, cela ne fonctionne pas avec la commande suivante: multiplex_files dir1 / * .f90 dir2 / et je ne comprends pas pourquoi? Pourrait expliquer s'il vous plaît qu'est-ce que last = "$ {@: -1}" et fichiers = ("$ {@: 2: $ # - 2}") dans votre solution ci-dessus? Je pense que mon erreur vient de ces 2 instructions. Salutations


Celles-ci utilisent la tranchage pour obtenir le dernier argument et la seconde par l'intermédiaire d'un avant-dernier élément. Quelle est la sortie de cette fonction lorsque vous l'exécutez comme ça?


La commande multiplex_files temp_sources / * .f90 dir2 / renvoie La première chose était Temp_sources / , La dernière chose était Dir2 / et un des fichiers est * .f90 : Pourriez-vous voir ce qui ne va pas? Salutations


Cela signifie que vous n'avez pas de fichiers correspondant *. F90 dans le répertoire actuel