257 votes

Comment rediriger la sortie vers une variable dans cette fonction shell?

J'ai un script comme ça

 genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
 

Je veux obtenir le flux généré par genhash dans une variable. Comment puis-je le rediriger dans une variable $hash à comparer dans une condition?

 if [ $hash -ne 0 ]
  then echo KO
  exit 0
else echo -n OK
  exit 0
fi
 

283voto

Richard Bronosky Points 3163

La réponse à la question est d'utiliser l' read commande.

Assurez-vous que tous ces autres réponses montrer des façons de ne pas faire ce que l'OP posé, mais qui a vraiment vis le reste d'entre nous qui ont cherché pour l'OP de la question.

Voici comment vous le faites...

Commande:

# I would usually do this on one line, but for readability...
series | of | commands \
| \
(
  read string;
  mystic_command --opt "$string" /path/to/file
) \
| \
handle_mystified_file

Voici ce qu'il fait et pourquoi il est important:

  1. Imaginons que l' series | of | commands , c'est très compliqué de la série de canalisations de commandes.
  2. mystic_command est peut accepter stdin que le fichier, mais pas l'option arg , par conséquent elle doit venir comme une variable**
  3. read prend stdin et la place dans la variable $string
  4. Mettre la read et de la mystic_command en un "sous-shell" par parenthèse n'est pas nécessaire, mais le fait couler comme une conduite continue comme si les 2 commandes dans un script séparé de fichier.

** Il y a toujours une alternative, et dans ce cas, l'alternative est moche et illisible:

mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file

...par rapport à...

series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file

...qui est tout à fait chronologique et logique.

82voto

Steven Penny Points 18523
read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

21voto

ony Points 3863

Je suppose que de manière compatible:

 hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`
 

mais je préfère

 hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"
 

5voto

codaddict Points 154968

Tu peux faire:

 hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)
 

ou

 hash=`genhash --use-ssl -s $IP -p 443 --url $URL`
 

Si vous voulez que le tuyau entier soit affecté à la variable, vous pouvez utiliser tout le pipeline dans les affectations ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X