J’ai un script comme ça
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
Je veux obtenir un stream généré par genhash dans une variable. Comment puis-je le redirect dans une variable $hash
pour comparer à l’intérieur d’un conditionnel?
if [ $hash -ne 0 ] then echo KO exit 0 else echo -n OK exit 0 fi
Utilisez la construction $( ... )
:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
TL; DR
Pour stocker "abc"
dans $foo
:
echo "abc" | read foo
Bien sûr, toutes ces autres réponses montrent des manières de ne pas faire ce que le PO lui demandait, mais cela gâche vraiment le rest d’entre nous qui avons cherché la question du PO.
read
. # I would usually do this on one line, but for readability... series | of | commands \ | \ ( read ssortingng; mystic_command --opt "$ssortingng" /path/to/file ) \ | \ handle_mystified_file
Faisons comme si la series | of | commands
series | of | commands
series | of | commands
est une série très compliquée de commandes de canalisation.
mystic_command
peut accepter le contenu d’un fichier en tant que stdin au lieu d’un chemin de fichier, mais pas l’argument --opt
il doit donc --opt
en tant que variable. La commande génère le contenu modifié et est généralement redirigé vers un fichier ou redirigé vers une autre commande. (Eg sed
, awk
, perl
, etc.)
read
prend stdin et le place dans la variable $ssortingng
Mettre la commande read
et mystic_command
dans un “sous-shell” entre parenthèses n’est pas nécessaire, mais le fait circuler comme un tube continu comme si les deux commandes étaient dans un fichier script séparé.
Il y a toujours une alternative, et dans ce cas l’alternative est laide et illisible par rapport à mon exemple ci-dessus.
# my example above as a oneliner series | of | commands | (read ssortingng; mystic_command --opt "$ssortingng" /path/to/file) | handle_mystified_file # ugly and unreadable alternative mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file
Ma façon entièrement chronologique et logique. L’alternative commence par la 4ème commande et déplace les commandes 1, 2 et 3 dans la substitution de commandes.
read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
Cette technique utilise la " substitution de processus " de Bash à ne pas confondre avec la " substitution de commande ".
Voici quelques bonnes références:
Je suppose que 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)"
Si un pipeline est trop compliqué pour envelopper $(...)
, envisagez d’écrire une fonction. Toutes les variables locales disponibles au moment de la définition seront accessibles.
function getHash { genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5 } hash=$(getHash)
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions
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 souhaitez que la totalité du canal soit affectée à la variable, vous pouvez utiliser l’intégralité du pipeline dans les affectations ci-dessus.
J’ai parfois eu une erreur en utilisant le constructeur $(`code`)
.
Enfin, j’ai eu une approche à ce sujet ici: https://stackoverflow.com/a/7902174/2480481
Fondamentalement, utiliser Tee pour relire la sortie et la mettre dans une variable. Voici comment vous voyez la sortie normale, puis lisez-la depuis la sortie.
n’est pas? Je suppose que votre tâche actuelle genhash ne produira que cela, une simple chaîne de hachage pourrait fonctionner pour vous.
Im soewewbie et toujours à la recherche de sortie complète et enregistrer dans 1 commande. Cordialement.