Por favor, explíqueme por qué la última echo
declaración está en blanco. Espero que XCODE
se incremente en el ciclo while a un valor de 1:
#!/bin/bash
OUTPUT="name1 ip ip status" # normally output of another command with multi line output
if [ -z "$OUTPUT" ]
then
echo "Status WARN: No messages from SMcli"
exit $STATE_WARNING
else
echo "$OUTPUT"|while read NAME IP1 IP2 STATUS
do
if [ "$STATUS" != "Optimal" ]
then
echo "CRIT: $NAME - $STATUS"
echo $((++XCODE))
else
echo "OK: $NAME - $STATUS"
fi
done
fi
echo $XCODE
Intenté usar la siguiente declaración en lugar del ++XCODE
método
XCODE=`expr $XCODE + 1`
y tampoco se imprimirá fuera de la declaración while. Creo que me falta algo sobre el alcance variable aquí, pero la vieja página de manual no me lo muestra.
Respuestas:
Debido a que está entrando en el bucle while, se crea un sub-shell para ejecutar el bucle while.
Ahora, este proceso hijo tiene su propia copia del entorno y no puede pasar ninguna variable a su padre (como en cualquier proceso Unix).
Por lo tanto, deberá reestructurar para que no se conecte al circuito. Alternativamente, puede ejecutar una función, por ejemplo, y
echo
el valor que desea devolver del subproceso.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
fuente
El problema es que los procesos combinados con una tubería se ejecutan en subcapas (y por lo tanto tienen su propio entorno). Pase lo que pase dentro
while
de la tubería no afecta nada fuera de la tubería.Su ejemplo específico se puede resolver reescribiendo la tubería a
o quizás
fuente
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
todos los días. Considere que puede utilizar varios a la vez y tratarlos como archivos ... ¡POSIBILIDADES!Esto debería funcionar también (porque echo y while están en la misma subcapa):
fuente
Una opción más:
EDITAR: Aquí, xsel es un requisito (instalarlo). Alternativamente, puede usar xclip: en
xclip -i -selection clipboard
lugar dexsel -i -p
fuente
mira si esos cambios ayudan
fuente
Otra opción es generar los resultados en un archivo desde el subshell y luego leerlo en el shell principal. algo como
fuente
Superé esto cuando estaba haciendo mi propio pequeño du:
El punto es que hago una subcapa con () que contiene mi variable SUM y el while, pero canalizo al entero () en lugar de al while en sí, lo que evita el problema.
fuente