Sortie d’écho d’une commande de canalisation

J’essaie juste de faire écho à une commande dans mon code script bash.

OVERRUN_ERRORS="$ifconfig | egrep -i "RX errors" | awk '{print $7}'" echo ${OVERRUN_ERRORS} 

Cependant, cela me donne une erreur et le 7 $ ne s’affiche pas dans la commande. Je dois le stocker dans une variable, car je traiterai la sortie (OVERRUN_ERRORS) ultérieurement. Quelle est la bonne syntaxe pour faire cela? Merci.

Syntaxe sur Bash

 foo="bar | baz" 

… assigne la chaîne “bar | baz” à la variable nommée foo ; il ne lance pas la bar | baz bar | baz comme un pipeline. Pour ce faire, vous devez utiliser la substitution de commandes , dans sa syntaxe moderne $() ou dans son formulaire obsolète basé sur un backtick:

 foo="$(bar | baz)" 

Sur le stockage du code pour une exécution ultérieure

Puisque votre intention n’est pas claire dans la question –

La manière correcte de stocker le code est d’utiliser une fonction, alors que la manière correcte de stocker la sortie est dans une chaîne:

 # store code in a function; this also works with pipelines get_rx_errors() { cat /sys/class/net/"$1"/statistics/rx_errors; } # store result of calling that function in a ssortingng eth0_errors="$(get_rx_errors eth0)" sleep 1 # wait a second for demonstration purposes, then... # compare: echoing the stored value, vs calculating a new value echo "One second ago, the number of rx errors was ${eth0_errors}" etho "Right now, it is $(get_rx_errors eth0)" 

Voir BashFAQ # 50 pour une discussion approfondie sur les pièges du stockage de code dans une chaîne, ainsi que des alternatives à celles-ci. BashFAQ # 48 , qui décrit en détail les risques de sécurité associés à une eval , est souvent pertinent.


Collecte des erreurs de compte d’interface

N’utilisez pas ifconfig , ni grep , ni awk pour cela – demandez simplement à votre kernel le numéro que vous voulez:

 #!/bin/bash for device in /sys/class/net/*; do [[ -e $device/statistics/rx_errors ]] || continue rx_errors=$(<"${device}/statistics/rx_errors") echo "Number of rx_errors for ${device##*/} is $rx_errors" done 

Utilisez $(...) pour capturer la sortie d’une commande, pas les guillemets.

 overrun_errors=$(ifconfig | egrep -i "RX errors" | awk '{print $7}') 

Vos guillemets doubles autour des RX errors sont un problème. Essayer;

 OVERRUN_ERRORS="$ifconfig | egrep -i 'RX errors' | awk '{print $7}'" 

Pour voir les commandes pendant leur exécution, vous pouvez utiliser

 set -v 

ou

 set -x 

Par exemple;

 set -x OVERRUN_ERRORS="$ifconfig | egrep -i 'RX errors' | awk '{print $7}'" set +x