web-dev-qa-db-fra.com

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

Supposons que j'ai un script Bash Shell appelé Myscript.sh qui nécessite un argument comme entrée.

Mais je veux le contenu du fichier texte appelé text.txt Pour être cet argument.

J'ai essayé cela mais ça ne marche pas:

cat text.txt | ./Myscript.sh

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

27
Narin

substitution de commande .

./Myscript.sh "$(cat text.txt)"
29

Vous pouvez utiliser une sortie de tuyau comme un argument de script shell.

Essayez cette méthode:

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

Si vous avez plus d'une commande dans le fichier, envisagez d'utiliser xargs ou parallèle , par exemple.

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

En lisant Stdin avec MapFile, vous pouvez ré-définir les paramètres de position.

#!/bin/bash

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

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

(Citant "$ @" fera de for lignes de boucle à la place).

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

Pour compléter @ BAC0N, lequel IMHO est le seul à répondre correctement à la question, voici une doublure courte qui préparera des arguments de la pipée à 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

0
aznoqmous

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

donc, vous pouvez entrer les valeurs un par un à comli.sh de comli.txt.

0
Ranjithkumar T