2017-10-09 2 views
2

Est-il possible d'utiliser STDIN dans une fonction bash?Variables de ligne de commande dans le pipeline

par exemple.

# echo "somevar = (100)" >> test.txt 
# grep -Eo "\([[:digit:]]+\)$" test.txt 
(100) 

Alors, c'est bon, j'ai mon numéro, ensuite je veux enlever les crochets. Ce que je faisais était:

string=`grep -Eo "\([[:digit:]]+\)$" test.txt`; echo ${string:1:-1} 
100 

Donc, mon problème a été résolu, mais ce que je passé beaucoup de temps à faire était:

grep -Eo "\([[:digit:]]+\)$" test.txt | echo ${$1:1:-1} 
grep -Eo "\([[:digit:]]+\)$" test.txt | ${$1:1:-1} 
grep -Eo "\([[:digit:]]+\)$" test.txt | xargs echo ${:1:-1} 
grep -Eo "\([[:digit:]]+\)$" test.txt | xargs -I 's' echo ${s:1:-1} 

etc, etc ... dont aucun travail.

Donc, en supposant que ce soit possible, comment utiliser la valeur piped dans la commande bash?

+0

On ne sait pas exactement ce que vous voulez faire de la syntaxe que vous écrivez. –

+0

... cela dit, pour une discussion générale de la lecture d'un flux d'entrée pour une utilisation native par shell, voir [BashFAQ # 1] (http://mywiki.wooledge.org/BashFAQ/001) - et [BashFAQ # 24 ] (http://mywiki.wooledge.org/BashFAQ/024) pour la discussion d'une mise en garde commune. –

+0

Je veux savoir si je pourrais obtenir la même chose que l'exemple de travail en utilisant un tuyau plutôt que de le stocker dans une variable. Bien que vos liens vers le BashFAQ semblent répondre à ma question. – Martin

Répondre

1

En supposant que vous souhaitez utiliser une entrée d'un tuyau et que chaque ligne d'entrée doit être traitée séparément, vous pouvez essayer:

echo "somevar = (100)" | grep -Eo "\([[:digit:]]+\)$" | while read in 
do 
    echo $in 
done 

La boucle while utilisera la commande read à lire une ligne à la fois dans la variable IN. Dans la boucle, vous pouvez faire le traitement dont vous avez besoin. Dans ce cas, j'ai utilisé un echo pour montrer que vous récupérez la valeur d'entrée.

+0

Cette formulation particulière est vulnérable à [BashFAQ # 24] (http://mywiki.wooledge.org/BashFAQ/024). –

+0

(btw, les noms de variables toutes majuscules sont utilisés pour les variables ayant une signification pour le système d'exploitation ou le shell, tandis que les noms avec au moins un caractère minuscule sont réservés à l'utilisation de l'application - voir http://pubs.opengroup.org/onlinepubs/9699919799 /basedefs/V1_chap08.html, quatrième paragraphe, donc, mieux vaut 'while read line' - ou' while IFS = read -r line', si vous ne voulez pas altérer les barres obliques inverses ou les espaces avant/arrière. –

+0

@Charles Duffy déclare que la variable 'IN' ne sera pas disponible en dehors de la boucle, mais elle est bonne si elle est utilisée. Je l'ai également changé en minuscule comme suggéré. –

0

La syntaxe que vous utilisez est pour les variables. Sauvegarder la sortie grep en variable est la façon naturelle de l'utiliser.

Si vous souhaitez utiliser un pipeline, vous devez utiliser quelque chose qui modifie stdin, plutôt qu'une variable. Considérons le sed.

grep -Eo "\([[:digit:]]+\)$" test.txt | sed 's/^(\|)$//g'