Объем переменной Bash

Объясните мне почему самое последнее echo оператор является пробелом? Я ожидаю это XCODE увеличен в цикле с условием продолжения к значению 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`

и это также не распечатает за пределами в то время как оператор. Я думаю, что пропускаю что-то о переменном объеме здесь, но страница старика не показывает его мне.

102
задан Fabio says Reinstate Monica 5 July 2019 в 13:36
поделиться

3 ответа

Поскольку Вы передаете по каналу в цикл с условием продолжения, оболочка sub создается для выполнения цикла с условием продолжения. Теперь этот дочерний процесс имеет свою собственную копию среды и не может пасовать назад переменные к ее родителю (как ни в каком процессе Unix).

Поэтому необходимо будет реструктурировать так, чтобы Вы не передавали по каналу в цикл. Кроме того, Вы могли работать в функции, например, и повторить значение, которое Вы хотите, возвратился из подпроцесса.

http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL

111
ответ дан Community 24 November 2019 в 04:29
поделиться

Проблема состоит в том, что процессы, соединенные с каналом, выполняются в подоболочках (и поэтому имейте их собственную среду). Что бы ни случилось в эти while ни на что не влияет за пределами канала.

Ваш определенный пример может быть решен путем перезаписи канала к

while ... do ... done <<< "$OUTPUT"

или возможно

while ... do ... done < <(echo "$OUTPUT")
104
ответ дан mweerden 24 November 2019 в 04:29
поделиться
 #!/bin/bash
 OUTPUT="name1 ip ip status"
+export XCODE=0;
 if [ -z "$OUTPUT" ]
----

                     echo "CRIT: $NAME - $STATUS"
-                    echo $((++XCODE))
+                    export XCODE=$(( $XCODE + 1 ))
             else

echo $XCODE

видят, помогают ли те изменения

1
ответ дан Kent Fredric 24 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: