Proszę wyjaśnić mi, dlaczego ostatnie echo
stwierdzenie jest puste? Spodziewam się, że XCODE
w pętli while zostanie zwiększona do wartości 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
Próbowałem użyć następującej instrukcji zamiast ++XCODE
metody
XCODE=`expr $XCODE + 1`
i to też nie będzie drukowane poza instrukcją while. Myślę, że brakuje mi czegoś na temat zakresu zmiennej, ale stara strona podręcznika nie pokazuje mi tego.
Odpowiedzi:
Ponieważ przechodzisz do pętli while, tworzona jest powłoka podrzędna do uruchamiania pętli while.
Teraz ten proces potomny ma swoją własną kopię środowiska i nie może przekazać żadnych zmiennych z powrotem do swojego rodzica (jak w każdym procesie uniksowym).
Dlatego musisz zmienić strukturę, aby nie wchodzić w pętlę. Alternatywnie możesz na przykład uruchomić funkcję i
echo
wartość, którą chcesz zwrócić z procesu podrzędnego.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
źródło
Problem polega na tym, że procesy złożone razem z potokiem są wykonywane w podpowłokach (a zatem mają własne środowisko). Cokolwiek dzieje się wewnątrz
while
, nie wpływa na nic poza rurą.Twój konkretny przykład można rozwiązać, przepisując potok na
a może
źródło
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
każdego dnia. Weź pod uwagę, że możesz używać wielu na raz i traktować je jak pliki ... MOŻLIWOŚCI!To również powinno działać (ponieważ echo i while znajdują się w tej samej podpowłoce):
źródło
Jeszcze jedna opcja:
EDYCJA: Tutaj xsel jest wymaganiem (zainstaluj go). Alternatywnie możesz użyć xclip:
xclip -i -selection clipboard
zamiastxsel -i -p
źródło
zobacz, czy te zmiany pomogą
źródło
Inną opcją jest zapisanie wyników do pliku z podpowłoki, a następnie odczytanie go w powłoce nadrzędnej. coś jak
źródło
Poradziłem sobie z tym, kiedy tworzyłem swój własny mały du:
Chodzi o to, że tworzę podpowłokę z () zawierającą moją zmienną SUM i while, ale przesyłam rurkę do całości () zamiast do samej while, co pozwala uniknąć problemu.
źródło