LINUX.ORG.RU

[bash] Почему при выходе из массива переменные возвращаются в исходное состояние?

 


0

0

Почему при выходе из массива переменные возвращаются в исходное состояние?

OBJECT=0
TEST=0
export IFS=';' 
tail -n 5 statlistparsed | 
while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do 
        echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1
TEST=1234
done
echo "TEST = ${TEST}"

statlistparsed:

49;50;48;48;21507;31;25
48;53;48;48;2699;31;69
53;48;48;48;23237;32;272
48;47;48;48;65708;32;176
51;51;48;48;67229;32;179

На выходе получаю TEST=0



Последнее исправление: linux4ever (всего исправлений: 1)

Может быть потому, что pipe после tail. И while, в итоге, как бы в отдельном контексте?
export TEST не помагает?

Dead ★★★★
()

Скорее всего порождается процесс, и из потомка в родителя данные, конечно же, не передаются.
Так что наверное следует обойтись без |, средствами for `...` или ещё чего-либо.

vahvarh ★★★
()

tail -n 5 говорит пропустить 5 строк с начала файла, следовательно, read сразу возвращает 0 и тело цикла не выполняется ни разу.

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

нет, проверил, tail -n 5 возвращает 5 последних строк, а вот конвейер | действительно создаёт дочерний процесс, как и должен, собственно. Просто нужно добавить export TEST

$ cat test.sh 
#!/bin/bash

OBJECT=0 
export TEST=0 
export IFS=';'  
#tail -n +2 $*|  
while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do  
        echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1 
TEST=1234 
done 
echo "TEST = ${TEST}" 

andrew@amb-01:~$ cat test.txt  | ./test.sh 
var1=49 var2=50 var3=48 var4=48 var5=21507 var6=31 var7=25 
var1=48 var2=53 var3=48 var4=48 var5=2699 var6=31 var7=69 
var1=53 var2=48 var3=48 var4=48 var5=23237 var6=32 var7=272 
var1=48 var2=47 var3=48 var4=48 var5=65708 var6=32 var7=176 
var1=51 var2=51 var3=48 var4=48 var5=67229 var6=32 var7=179 
var1= var2= var3= var4= var5= var6= var7=
TEST = 1234
Deleted
()
Ответ на: комментарий от Deleted

Заменил на cat statlistparsed, тоже самое. Тело цикла выполняется, проверял установкой в него echo «${TEST}».

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

виноват, всё равно не правильно, сейчас разберёмся )

Deleted
()
while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do
    echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1
    TEST=1234
done < statlistparsed 
sdio ★★★★★
()
Ответ на: комментарий от linux4ever
 andrew@amb-01:~$ cat test.sh #!/bin/bash

tail -n +2 $*| ( OBJECT=0 TEST=0 export IFS=';' while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1    TEST=1234 done echo "TEST = ${TEST}" ) andrew@amb-01:~$ cat test.txt | ./test.sh var1=48 var2=53 var3=48 var4=48 var5=2699 var6=31 var7=69 var1=53 var2=48 var3=48 var4=48 var5=23237 var6=32 var7=272 var1=48 var2=47 var3=48 var4=48 var5=65708 var6=32 var7=176 var1=51 var2=51 var3=48 var4=48 var5=67229 var6=32 var7=179 TEST = 1234

выносим tail за скобки и выполняем весь скрипт в порождённом shell

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

Работает ^) Из цикла через выведенный файл выйду.

linux4ever
() автор топика
Ответ на: комментарий от Deleted
andrew@amb-01:~$ cat test.sh 
#!/bin/bash

tail -n +2 $*|  
(
OBJECT=0 
TEST=0 
export IFS=';'  
while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do  
        echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1 
	TEST=1234 
done 
echo "TEST = ${TEST}"
) 
andrew@amb-01:~$ cat test.txt  | ./test.sh 
var1=48 var2=53 var3=48 var4=48 var5=2699 var6=31 var7=69 
var1=53 var2=48 var3=48 var4=48 var5=23237 var6=32 var7=272 
var1=48 var2=47 var3=48 var4=48 var5=65708 var6=32 var7=176 
var1=51 var2=51 var3=48 var4=48 var5=67229 var6=32 var7=179 
TEST = 1234

выносим tail за скобки и выполняем весь скрипт в порождённом shell что-то сегодня не аккуратно получается )

Deleted
()
Ответ на: комментарий от linux4ever

linux4ever> Разделитель отвалился (

Чаво?

 ./test1.sh
var1=49 var2=50 var3=48 var4=48 var5=21507 var6=31 var7=25
var1=48 var2=53 var3=48 var4=48 var5=2699 var6=31 var7=69
var1=53 var2=48 var3=48 var4=48 var5=23237 var6=32 var7=272
var1=48 var2=47 var3=48 var4=48 var5=65708 var6=32 var7=176
var1=51 var2=51 var3=48 var4=48 var5=67229 var6=32 var7=179
1234

cat test1.sh

IFS=';'
while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do
    echo "var1=$X var2=$Y var3=$X1 var4=$Y1 var5=$OBJECT var6=$COUNT var7=$COUNT1"
    TEST=1234
done < statlistparsed
echo $TEST


sdio ★★★★★
()
OBJECT=0
TEST=0
export IFS=';'
function get_test
{
tail -n 5 statlistparsed |
while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do
#echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1
TEST=1234
echo "${TEST}"
done
}
TEST=`get_test`
echo "TEST = ${TEST}"
xydo ★★
()

если это bash, то можно заюзать process substitution

while read X Y X1 Y1 OBJECT COUNT COUNT1 ; do  
        echo "var1="$X "var2="$Y "var3="$X1 "var4="$Y1 "var5="$OBJECT "var6="$COUNT "var7="$COUNT1 
TEST=1234 
done < <(tail -n 5 statlistparsed)

P.S. и каычки совсем не туде съехали, или переменные квотируйте, или всю строку сразу.

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