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?

Narin
la source

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 {}
zzart
la source
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
reinierpost
la source
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.

Ranjithkumar T
la source
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
bac0n
la source
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
aznoqmous
la source