Пожалуйста, объясните мне, почему самое последнее echo
утверждение пустое? Я ожидаю, что XCODE
это увеличивается в цикле while до значения 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
Я пробовал использовать следующий оператор вместо ++XCODE
метода
XCODE=`expr $XCODE + 1`
и он тоже не будет печататься вне оператора while. Я думаю, что мне здесь что-то не хватает в области видимости переменных, но старая страница руководства мне этого не показывает.
Ответы:
Поскольку вы подключаетесь к циклу while, создается суб-оболочка для запуска цикла while.
Теперь у этого дочернего процесса есть собственная копия среды, и он не может передавать никакие переменные обратно своему родительскому процессу (как и в любом процессе Unix).
Поэтому вам нужно будет реструктурировать, чтобы вы не попадали в петлю. В качестве альтернативы вы можете запустить функцию, например, и
echo
значение, которое вы хотите вернуть из подпроцесса.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
источник
Проблема в том, что процессы, объединенные в конвейер, выполняются в подоболочках (и, следовательно, имеют свою собственную среду). Все, что происходит внутри
while
трубы, не влияет ни на что за пределами трубы.Ваш конкретный пример можно решить, переписав канал на
или возможно
источник
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
каждый день. Учтите, что вы можете использовать несколько одновременно и обращаться с ними как с файлами ... ВОЗМОЖНОСТИ!Это тоже должно работать (потому что echo и while находятся в одной подоболочке):
источник
Еще один вариант:
РЕДАКТИРОВАТЬ: Здесь xsel является требованием (установите его). В качестве альтернативы вы можете использовать xclip:
xclip -i -selection clipboard
вместоxsel -i -p
источник
Посмотрим, помогут ли эти изменения
источник
Другой вариант - вывести результаты в файл из подоболочки, а затем прочитать его в родительской оболочке. что-то вроде
источник
Я обошел это, когда делал свой собственный маленький ду:
Дело в том, что я делаю подоболочку с (), содержащую мою переменную SUM и while, но я передаю целую () вместо самого while, что позволяет избежать ошибок.
источник