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: p> et faire après: p> i obtenir la liste de tous les fichiers correspondant à la carte générique, c'est-à-dire: p> mais maintenant, je Voudrais rendre la sonde pour le moment, si je le fais dans une fonction Bash : p> puis, à l'exécution suivante: p> Puis je n'obtiens que le premier nom de fichier 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 Comment contourner ce problème? P> P> 2 $ code> dans une fonction. p>
$ multiple_files. $ myfile dir / code> p>
probe_gcph.txt code> qui est imprimé pour le troisième écho (
echo $ myfile code> ) Dans la définition de la fonction Bash. P>
sonde_gcph.txt code> et le passage d'une faute de caractères génériques comme argument 2 $ sans l'élargir. P>
3 Réponses :
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/
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
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 CODE> pour effectuer une expansion Glob, on peut simplement laisser des guillemets sur une expansion de paramètre (éventuellement avec
ifs code> effacé pour éviter la fractionnement de la chaîne ) Pour effectuer le globe global, sans i> avoir un
$ (rm -rf ~) code> sous-chaîne de vos données traitées comme une commande. Bashfaq # 48 est pertinent.
É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
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 / code> et je ne comprends pas pourquoi? Pourrait expliquer s'il vous plaît qu'est-ce que
last = "$ {@: -1}" code> et
fichiers = ("$ {@: 2: $ # - 2}") code> 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 / code> renvoie
La première chose était Temp_sources / Code>,
La dernière chose était Dir2 / code> et
un des fichiers est * .f90 code>: Pourriez-vous voir ce qui ne va pas? Salutations
Cela signifie que vous n'avez pas de fichiers correspondant *. F90 code> dans le répertoire actuel
Citez votre faune sauvage?