75 votes

Comment écrire un script qui accepte les entrées d'un fichier ou de stdin ?

Comment peut-on écrire un script qui accepte des entrées provenant soit d'un argument de type nom de fichier, soit de stdin ?

par exemple, vous pouvez utiliser less De cette façon, on peut exécuter less filename et de manière équivalente cat filename | less .

Existe-t-il un moyen simple de le faire ? ou dois-je réinventer la roue et écrire un peu de logique dans le script ?

3voto

jetimms Points 101

Utiliser (ou enchaîner) quelque chose d'autre qui se comporte déjà de cette manière, et utiliser "$@"

disons que je veux écrire un outil qui remplacera les espaces dans le texte par des tabulations.

tr est la manière la plus évidente de le faire, mais elle uniquement accepte stdin, nous devons donc enchaîner sur la fonction cat :

$ cat entab1.sh
#!/bin/sh

cat "$@"|tr -s ' ' '\t'
$ cat entab1.sh|./entab1.sh
#!/bin/sh

cat     "$@"|tr -s      '       '       '\t'
$ ./entab1.sh entab1.sh
#!/bin/sh

cat     "$@"|tr -s      '       '       '\t'
$ 

pour un exemple où l'outil utilisé se comporte déjà de cette manière, nous pourrions réimplémenter ceci avec sed à la place :

$ cat entab2.sh
#!/bin/sh

sed -r 's/ +/\t/g' "$@"
$

1voto

RaamEE Points 452

Vous pouvez aussi rester simple et utiliser ce code


Lorsque vous créez un fichier script pass_it_on.sh avec ce code,

#!/bin/bash

cat

Vous pouvez exécuter

cat SOMEFILE.txt | ./pass_it_on.sh

et tout le contenu de stdin sera simplement recraché à l'écran.


Vous pouvez également utiliser ce code pour conserver une copie de stdin dans un fichier et la transmettre à l'écran.

#!/bin/bash

tmpFile=`mktemp`
cat > $tmpFile
cat $tmpFile    

et voici un autre exemple, peut-être plus lisible, expliqué ici :

http://mockingeye.com/blog/2013/01/22/reading-everything-stdin-in-a-bash-script/

#!/bin/bash

VALUE=$(cat)

echo "$VALUE"

Amusez-vous bien.

RaamEE

1voto

kenorb Points 22006

La méthode la plus simple et conforme à POSIX est la suivante :

file=${1--}

ce qui est équivalent à ${1:--} .

Ensuite, lisez le fichier comme d'habitude :

while IFS= read -r line; do
  printf '%s\n' "$line" # Or: env POSIXLY_CORRECT=1 echo "$line"
done < <(cat -- "$file")

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