Почему я не могу получить инкрементный внешний цикл в сценарии оболочки

Я использую этот скрипт для создания счетчика, и я хочу получить к нему доступ за пределами внутреннего цикла, но мне не повезло. Что мне не хватает?

while [ 1 ] do COUNTER=0 ls /tmp/paping* | grep -v pid | while read pap do ret=`cat $pap` if [ "a$ret" == "aTimeout" ] then echo "Do something" else arr[$COUNTER]=$pap COUNTER=$(( COUNTER + 1 )) fi sleep 0.3 echo $COUNTER done #THIS LINE RETURNs 0 echo $COUNTER done
1
задан 5 January 2018 в 20:57

6 ответов

Как @steeldriver указал мне, когда я подключаюсь, я создаю подоболочку, а значения var не передаются внешнему var.

Как показано в этой ссылке

Решение будет примерно таким:

while [ 1 ] 
do
        COUNTER=0
 while read pap
        do
                ret=`cat $pap`
                if [ "a$ret" == "aTimeout" ]
                then
                        echo "do something"
                else
                        arr[$COUNTER]=$pap
                        COUNTER=$(( COUNTER + 1 ))
                fi
                sleep 0.3
                echo $COUNTER
        done < <( ls /tmp/paping* | grep -v pid)
        echo $COUNTER
done

Теперь мой счетчик работает как ожидалось!

2
ответ дан 22 May 2018 в 15:44

Как @steeldriver указал мне, когда я подключаюсь, я создаю подоболочку, а значения var не передаются внешнему var.

Как показано в этой ссылке

Решение будет примерно таким:

while [ 1 ] do COUNTER=0 while read pap do ret=`cat $pap` if [ "a$ret" == "aTimeout" ] then echo "do something" else arr[$COUNTER]=$pap COUNTER=$(( COUNTER + 1 )) fi sleep 0.3 echo $COUNTER done < <( ls /tmp/paping* | grep -v pid) echo $COUNTER done

Теперь мой счетчик работает как ожидалось!

3
ответ дан 17 July 2018 в 23:47

Как @steeldriver указал мне, когда я подключаюсь, я создаю подоболочку, а значения var не передаются внешнему var.

Как показано в этой ссылке

Решение будет примерно таким:

while [ 1 ] do COUNTER=0 while read pap do ret=`cat $pap` if [ "a$ret" == "aTimeout" ] then echo "do something" else arr[$COUNTER]=$pap COUNTER=$(( COUNTER + 1 )) fi sleep 0.3 echo $COUNTER done < <( ls /tmp/paping* | grep -v pid) echo $COUNTER done

Теперь мой счетчик работает как ожидалось!

3
ответ дан 24 July 2018 в 17:06

Предполагая, что ваша оболочка bash, размещение команды shopt -s lastpipe в верхней части вашего скрипта является одним из возможных решений.

0
ответ дан 22 May 2018 в 15:44

Предполагая, что ваша оболочка bash, размещение команды shopt -s lastpipe в верхней части вашего скрипта является одним из возможных решений.

0
ответ дан 17 July 2018 в 23:47

Предполагая, что ваша оболочка bash, размещение команды shopt -s lastpipe в верхней части вашего скрипта является одним из возможных решений.

0
ответ дан 24 July 2018 в 17:06

Другие вопросы по тегам:

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