LINUX.ORG.RU

[bash] странное поведение

 


0

0

Есть простой скриптик:

#!/bin/bash
I=0
while true; do
    echo $I
    I=`expr $I + 1`
    if [ $I -eq 3 ]; then
      	break
    fi    
done
echo "iterator = $I"
он выводит числа от 0 до 2 и в конце строчку с текущим значением переменной i = 3, если теперь добавить обработку строк фаила
#!/bin/bash
I=0
cat file | while read LINE; do
    echo line $I: $LINE
    I=`expr $I + 1`
    if [ $I -eq 2 ]; then
      	break
    fi    
done
echo "iterator = $I"
то в конце переменная $i обнулиться! Почему так происходит? Обрабатывать строки на баше не айс?


cat file | while read LINE; do

Тут создаётся дочерний процесс bash'а и переменная изменяется уже в нём.

anonymous
()
[werehuman@lithium /tmp] $ cat test.sh
#!/bin/bash
I=0
while read LINE; do
    echo line $I: $LINE
    I=`expr $I + 1`
    if [ $I -eq 2 ]; then
         break
    fi
done < file
echo "iterator = $I"

[werehuman@lithium /tmp] $ cat file
abc
def
ghi
jkl
[werehuman@lithium /tmp] $ sh test.sh
line 0: abc
line 1: def
iterator = 2
Werehuman ★★
()

для чего это зетейвается? могет seq спасет?

wfrr ★★☆
()

что за извращения?

I=`expr $I + 1`
если «I» — целочисленная переменная, то так и нужно говорить
declare -i I
I=I+1

pupok ★★
()

Интересно, когда придут сюда те кто будут орать про "башизмы".

true_admin ★★★★★
()
Ответ на: комментарий от sdio

Пришлось перейти на awk =) Надо было обработать 50 начальных строк в фаиле. Все ужалось до одной cтрашноватой строчки: awk 'BEGIN {ORS="&"} {if (NR <= 50) {gsub(/\[0\]/, "["NR-1"]"); print}}' $QUEUEFILE

fasol8
() автор топика
Ответ на: комментарий от Werehuman

Werehuman интересное решение, можно было так и остаться в рамках баша, кстати на нем некоторые умельцы даже игру life написали)))

fasol8
() автор топика
Ответ на: комментарий от fasol8

>Надо было обработать 50 начальных строк в фаиле
man head

xydo ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.