虽然有很多好的答案,但它们都没有按照我希望的方式工作。因此,这是我的解决方案,其中包含以下关键点:
帮助健忘的程序员
至少我很难在这样的事情之后总是记住错误检查:var=$(myFunction)
允许使用换行符分配值\n
有些解决方案不允许这样做,因为有些解决方案忘记了要分配的值周围的单引号。正确的方法:eval "${returnVariable}='${value}'" 甚至更好:请参阅下面的下一点。
使用printf 代替eval
只需尝试使用类似 myFunction "date && var2" 的东西来解决这里的一些假设解决方案。 eval 将执行赋予它的任何内容。我只想分配值,所以我改用printf -v "${returnVariable}" "%s" "${value}"。
封装和防止变量名冲突
如果其他用户或至少对函数了解较少的人(这可能是我几个月后)正在使用myFunction,我不希望他们知道他必须使用全局返回值名称或一些禁止使用变量名。这就是为什么我在myFunction 的顶部添加了名称检查:
if [[ "${1}" = "returnVariable" ]]; then
echo "Cannot give the ouput to \"returnVariable\" as a variable with the same name is used in myFunction()!"
echo "If that is still what you want to do please do that outside of myFunction()!"
return 1
fi
请注意,如果您必须检查大量变量,也可以将其放入函数本身。
如果我仍想使用相同的名称(此处:returnVariable),我只需创建一个缓冲区变量,将其提供给myFunction,然后复制值returnVariable。
原来是这样:
myFunction():
myFunction() {
if [[ "${1}" = "returnVariable" ]]; then
echo "Cannot give the ouput to \"returnVariable\" as a variable with the same name is used in myFunction()!"
echo "If that is still what you want to do please do that outside of myFunction()!"
return 1
fi
if [[ "${1}" = "value" ]]; then
echo "Cannot give the ouput to \"value\" as a variable with the same name is used in myFunction()!"
echo "If that is still what you want to do please do that outside of myFunction()!"
return 1
fi
local returnVariable="${1}"
local value=$'===========\nHello World\n==========='
echo "setting the returnVariable now..."
printf -v "${returnVariable}" "%s" "${value}"
}
测试用例:
var1="I'm not greeting!"
myFunction var1
[[ $? -eq 0 ]] && echo "myFunction(): SUCCESS" || echo "myFunction(): FAILURE"
printf "var1:\n%s\n" "${var1}"
# Output:
# setting the returnVariable now...
# myFunction(): SUCCESS
# var1:
# ===========
# Hello World
# ===========
returnVariable="I'm not greeting!"
myFunction returnVariable
[[ $? -eq 0 ]] && echo "myFunction(): SUCCESS" || echo "myFunction(): FAILURE"
printf "returnVariable:\n%s\n" "${returnVariable}"
# Output
# Cannot give the ouput to "returnVariable" as a variable with the same name is used in myFunction()!
# If that is still what you want to do please do that outside of myFunction()!
# myFunction(): FAILURE
# returnVariable:
# I'm not greeting!
var2="I'm not greeting!"
myFunction "date && var2"
[[ $? -eq 0 ]] && echo "myFunction(): SUCCESS" || echo "myFunction(): FAILURE"
printf "var2:\n%s\n" "${var2}"
# Output
# setting the returnVariable now...
# ...myFunction: line ..: printf: `date && var2': not a valid identifier
# myFunction(): FAILURE
# var2:
# I'm not greeting!
myFunction var3
[[ $? -eq 0 ]] && echo "myFunction(): SUCCESS" || echo "myFunction(): FAILURE"
printf "var3:\n%s\n" "${var3}"
# Output
# setting the returnVariable now...
# myFunction(): SUCCESS
# var3:
# ===========
# Hello World
# ===========