Вы можете заставить вызывающего передать имя переменной для хранения выходного значения, а затем создать глобальную переменную с этим именем внутри функции, например:
myfunc() { declare -g $1="hello"; }
Затем вызвать ее как:
myfunc mystring
echo "$mystring world" # gives "hello world"
Итак, ваши функции можно переписать так:
hello() {
declare -g $1="Hello"
}
func() {
hello Var
echo "${Var/e/E} world"
}
Единственное ограничение - переменные, используемые для хранения выходных значений, не могут быть локальными.
Связанный пост, в котором говорится об использовании namerefs: