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.
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)"
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.
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