7
votes

Comment itérer les paramètres positionnels dans un script Bash?

Où est-ce que je vais mal?

J'ai des fichiers comme suit: p> xxx pré>

i passe tau code>, xhpl , FFT code>, MPI_TILE_IO code> et PMB_MPI code> comme paramètres positionnels sur le script comme suit: p>

point=$1     #initially points to first parameter
i="0"
while [$i -le 4]
do
  grep "$str" ${filename}${point}.txt
  i=$[$i+1]
  point=$i     #increment count to point to next positional parameter
done


3 commentaires

Bash Script .. désolé j'ai oublié de le mentionner


N'oubliez pas de mettre des choses comme ça dans les tags, cela facilitera la question de trouver pour votre public cible, c'est-à-dire. Les personnes qui ont filtré des scripts Bash comme une étiquette intéressante.


Veuillez garder le code formaté comme code - ce sera beaucoup plus facile à comprendre.


5 Réponses :


2
votes

voir ici , vous avez besoin de décalage vers des paramètres de positionnement .


0 commentaires

9
votes

Configurez votre boucle comme celle-ci. Avec cette syntaxe, la boucle itère sur les paramètres de position, en attribuant à chacun à "point" à tour de rôle.

for point; do
  grep "$str" ${filename}${point}.txt 
done


2 commentaires

Je suggère des citations autour de l'argument du nom de fichier pour éviter les problèmes avec des espaces.


Aaron, bon point. Je copie / collé cette ligne de la question sans le modifier. Dennis, ce n'est pas correct. Il n'y a pas besoin d'attribuer directement au point. Voir la section "Commandes composées" du manuel Bash pour tous les détails.



1
votes

Essayez quelque chose comme ceci:

# Iterating through the provided arguments
for ARG in $*; do
    if [ -f filename_$ARG.txt]; then
        grep "$str" filename_$ARG.txt 
    fi
done


0 commentaires

0
votes
args=$@;args=${args// /,}
grep "foo" $(eval echo file{$args})

0 commentaires

5
votes

Il y a plus d'une façon de le faire et, alors que j'utiliserais shift , voici une autre pour la variété. Il utilise la fonctionnalité d'indirection de Bash: xxx p> Un avantage à cette méthode est que vous pouvez démarrer et arrêter votre boucle n'importe où. En supposant que vous avez validé la plage, vous pouvez faire quelque chose comme: xxx

aussi, si vous souhaitez que le dernier param: $ {! #}


1 commentaires

Belle addition dénnis - juste ce dont j'ai besoin maintenant