2013-05-26 3 views
0

По какой-то причине функция hello2 не изменит параметр b.параметр не будет изменен в функции bash

#!/bin/bash 

function hello1 { 
    a=hello1A 
} 

function hello2 { 
    while read -a line; do 
    echo ${line[*]} 
    done 

    b=hello2B 
} 

a=mainA 
b=mainB 

echo $a 
echo $b 
hello1 
echo some text | hello2 
echo $a 
echo $b 

печатает:

mainA 
mainB 
some text 
hello1A 
mainB 

, но я хочу, чтобы изменить б тоже:

mainA 
mainB 
some text 
hello1A 
hello2B <----- ! 

ответ

8

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

hello2 << EOF 
some text 
EOF 

или (менее портативный)

hello2 <<< 'some text' 

Если "некоторый текст" не буквально, но вывод команды, вы также можете сделать:

hello2 << EOF 
$(cmd) 
EOF 

или (менее портативный):

hello2 < <(cmd) 

An Другой вариант заключается сохранить подоболочку живой на более длительный срок и сделать:

echo some text | { hello2 
echo $a 
echo $b 
} 

но имейте в виду, что $b вернется к своему исходному значению после блока заканчивается.

+0

Спасибо за быстрый ответ! вы, сэр, гений! – Stasv

Смежные вопросы