Explique por que a última echo
declaração está em branco. Espero que XCODE
seja incrementado no loop while para um 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
Tentei usar a seguinte instrução em vez do ++XCODE
método
XCODE=`expr $XCODE + 1`
e também não imprimirá fora da instrução while. Acho que estou perdendo algo sobre escopo de variável aqui, mas a velha página do manual não está mostrando para mim.
Respostas:
Como você está canalizando para o loop while, um sub-shell é criado para executar o loop while.
Agora, este processo filho tem sua própria cópia do ambiente e não pode passar nenhuma variável de volta para seu pai (como em qualquer processo Unix).
Portanto, você precisará reestruturar para não entrar no circuito. Como alternativa, você pode executar em uma função, por exemplo, e
echo
o valor que deseja retornar do subprocesso.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
fonte
O problema é que os processos reunidos com um pipe são executados em subshells (e, portanto, têm seu próprio ambiente). O que quer que aconteça dentro do
while
não afeta nada fora do tubo.Seu exemplo específico pode ser resolvido reescrevendo o tubo para
ou talvez
fonte
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
todos os dias. Considere que você pode usar vários de uma vez e tratá-los como arquivos ... POSSIBILIDADES!Isso também deve funcionar (porque echo e while estão no mesmo subshell):
fonte
Mais uma opção:
EDITAR: Aqui, xsel é um requisito (instale-o). Alternativamente, você pode usar xclip: em
xclip -i -selection clipboard
vez dexsel -i -p
fonte
veja se essas mudanças ajudam
fonte
Outra opção é gerar os resultados em um arquivo do subshell e depois lê-lo no shell pai. algo como
fonte
Eu contornei isso quando estava fazendo meu próprio du:
O ponto é que eu faço um subshell com () contendo minha variável SUM e o while, mas eu canalizo para o todo () em vez de para o próprio while, o que evita o problema.
fonte