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?
./Myscript.sh "$(cat text.txt)"
Vous pouvez utiliser une sortie de tuyau comme un argument de script shell.
Essayez cette méthode:
cat text.txt | xargs -I {} ./Myscript.sh {}
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
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
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
.