由于某种原因,hello2函数不会改变b参数。
#!/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
但我也想改变b:
mainA
mainB
some text
hello1A
hello2B <----- !
答案 0 :(得分:8)
在子shell中调用hello2
函数,它只更改子shell中变量的值。如果要更新,请不要使用管道。你可以这样做:
hello2 << EOF
some text
EOF
或(不太便携)
hello2 <<< 'some text'
如果“some text”不是文字,而是命令的输出,你也可以这样做:
hello2 << EOF
$( cmd )
EOF
或(不太便携):
hello2 < <(cmd)
另一个选择是让子shell保持更长的持续时间并执行:
echo some text | { hello2
echo $a
echo $b
}
但请注意,$b
将在块结束后恢复为原始值。