参数在bash函数中不会改变

时间:2013-05-26 14:29:55

标签: bash

由于某种原因,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 <----- !

1 个答案:

答案 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将在块结束后恢复为原始值。