72 votes

Puis-je utiliser la sortie de pipe comme argument de Shell Shell ?

Supposons que j'ai une bash Shell Shell appelée Myscript.sh qui ont besoin d'un argument en entrée.

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

J'ai essayé mais cela ne fonctionne pas :

cat text.txt | ./Myscript.sh

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

2voto

bac0n Points 123

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

#!/bin/bash

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

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

$ cat test.txt | ./script.sh
1 first
2 second line 
3 third

0voto

Ranjithkumar T Points 449

Essayez,

 $ 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 par une pour comli.sh de comli.txt .

0voto

Curtis Yallop Points 131

S'il y a des nouvelles lignes (LF) ou des tabulations dans le fichier et que vous voulez les mettre dans un seul argument (et non pas que bash convertisse LF en espaces et utilise chaque mot comme un argument séparé), vous pouvez utiliser ceci :

./Myscript.sh "$(IFS=''; cat text.txt)"

(subshell utilisé pour que l'IFS ne soit pas touché dans le Shell principal)

Un simple test pour montrer que ça marche :

echo ">>>$(IFS=''; cat text.txt)<<<"

Version non sub-Shell :

IFS=" " ; echo ">>>$(cat text.txt)<<<" ; IFS=$' \t\n'

Voir aussi : https://stackoverflow.com/questions/2789319/file-content-into-unix-variable-with-newlines

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X