Puis-je utiliser la sortie de canal comme argument de script shell?


22

Supposons que j'ai un script shell bash appelé Myscript.shqui nécessite un argument en entrée.

Mais je veux que le contenu du fichier texte appelé text.txtsoit cet argument.

J'ai essayé mais cela ne fonctionne pas:

cat text.txt | ./Myscript.sh

Y a-t-il un moyen de faire cela?

Réponses:



19

Vous pouvez utiliser la sortie de canal comme argument de script shell.

Essayez cette méthode:

cat text.txt | xargs -I {} ./Myscript.sh {}

2

Si vous avez plusieurs commandes dans le fichier, pensez à utiliser xargs ou parallèle , par exemple

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

0

Essayer,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

afin que vous puissiez saisir les valeurs une à une à comli.shpartir de comli.txt.



0

En lisant stdin avec mapfile, vous pouvez réinitialiser les paramètres de position.

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

(Citer "$ @" créera des forlignes de boucle à la place).

$ cat test.txt | ./script.sh
1 one
2 two
3 tree

0

Pour compléter @ bac0n dont l'IMHO est le seul à répondre correctement à la question, voici un raccourci qui ajoutera des arguments canalisés à votre liste d'arguments de script:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

Exemple d'utilisation:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.