当函数包含其他回音时,从bash函数(<;4.3)返回字符串的最安全方法
我想在函数中打印一些日志样式的消息,但还需要在函数末尾返回一个字符串值 我遇到过名称空间,但不幸的是,我没有使用最新版本的bash 例如:当函数包含其他回音时,从bash函数(<;4.3)返回字符串的最安全方法,bash,function,shell,Bash,Function,Shell,我想在函数中打印一些日志样式的消息,但还需要在函数末尾返回一个字符串值 我遇到过名称空间,但不幸的是,我没有使用最新版本的bash 例如: doThing() { echo "stuff" echo "things" echo "usefulstring" } result=$( doThing ) [[ $result = "usefulstring" ]] && echo "Worked" || echo "Failed. :(" 我真的宁愿避免使用g
doThing() {
echo "stuff"
echo "things"
echo "usefulstring"
}
result=$( doThing )
[[ $result = "usefulstring" ]] && echo "Worked" || echo "Failed. :("
我真的宁愿避免使用globals,从我读到的内容来看,我应该避免使用eval。
那么还有什么其他选择呢
另外,我希望看到stdout上的日志回声,而不是返回值。是否可以在函数中使用重定向来实现此目的?您可以使用数组并获取最后一个元素:
doThing() {
echo "stuff"
echo "things"
echo "usefulstring"
}
# This creates an array
result=($( doThing ))
echo ${result[@]} # Just for debugging
# This get the index of the last element
end=$(( ${#result[*]} - 1 ))
result=${result[$end]}
echo $result # Just for debugging
[[ $result = "usefulstring" ]] && echo "Worked" || echo "Failed. :("
给出:
stuff things usefulstring
usefulstring
Worked
假设您可以使用最小的磁盘I/O,那么您可以打开一个文件描述符来写入文件,然后在函数完成后解析它 在本例中,fd
3
将用于我们的目的
doThing() {
echo "stuff"
echo "things"
exec 3<> /tmp/foo
echo "usefulstring" >&3
exec 3>&-
}
结果将出现在str
中,您可以在条件中引用它。如果您的文件系统保持/tmp
或/var
忙碌,您可以使用mktemp
在本地目录中创建一个文件,用于fd
这也满足了您的最后一个要求-我希望在stdout上看到日志回波,但不希望看到返回值。通常,程序(或shell函数)的日志类型输出与其主要输出数据不同,应该发送到标准错误而不是标准输出,如下所示:
doThing() {
echo "stuff" >&2 # Logging output goes to stderr
echo "things" >&2
echo "usefulstring"
}
result=$( doThing ) 2>&1
…然后result=$(doThing)
将把“stuff”和“things”打印到stderr,并将result
设置为“usefulstring”。如果希望日志输出最终转到脚本的标准输出,可以将其重定向回如下所示:
doThing() {
echo "stuff" >&2 # Logging output goes to stderr
echo "things" >&2
echo "usefulstring"
}
result=$( doThing ) 2>&1
@anubhava测试纯粹是为了演示,我需要以某种方式在结果中存储“usefulstring”。可能是通过变量扩展?@JordanMackie:你的意思是说你想
回送多个字符串,但只返回last@Inian就是这样!如果usefulstring
是usefulstring
喜欢它,则此功能将中断!非常感谢。