是否有任何习惯用于从脚本中的bash函数返回多个值?
http://tldp.org/LDP/abs/html/assortedtips.html描述了如何回显多个值并处理结果(例如,示例35-17),但如果某些返回值是带空格的字符串,则会变得棘手在.
一种更有条理的返回方式是分配给全局变量,比如
foo () {
FOO_RV1="bob"
FOO_RV2="bill"
}
foo
echo "foo returned ${FOO_RV1} and ${FOO_RV2}"
Run Code Online (Sandbox Code Playgroud)
我意识到,如果我需要在shell脚本中重新入门,我可能做错了,但我仍然感到非常不舒服地抛出全局变量只是为了保持返回值.
有没有更好的办法?我更喜欢可移植性,但如果必须指定的话,它可能不是真正的限制#!/bin/bash
.
miv*_*ivk 14
在您的值永远不包含空格的特殊情况下,这个read
技巧可以是一个简单的解决方案:
get_vars () {
#...
echo "value1" "value2"
}
read var1 var2 < <(get_vars)
echo "var1='$var1', var2='$var2'"
Run Code Online (Sandbox Code Playgroud)
但是,当然,一旦其中一个值存在空间,它就会中断.您可以IFS
在函数中修改和使用特殊的分隔符echo
,但结果并不比其他建议的解决方案简单.
fro*_*hem 13
这个问题是5年前发布的,但我有一些有趣的答案发布.我刚刚开始学习bash,我也遇到了和你一样的问题.我认为这个技巧可能会有所帮助:
#!/bin/sh
foo=""
bar=""
my_func(){
echo 'foo="a"; bar="b"'
}
eval $(my_func)
echo $foo $bar
# result: a b
Run Code Online (Sandbox Code Playgroud)
当子进程无法将值发送回其父进程时,此技巧对于解决问题也很有用.
就像我喜欢shell一样,可能的情况是,只要你抛出任意结构化数据,Unix bourne/posix shell就不是正确的选择.
如果字段内没有字符,则用其中一个字符分隔.典型的例子是/etc/passwd
,/etc/group
以及使用冒号作为字段分隔符的各种其他文件.
如果使用一个可以在字符串中处理NUL字符的shell,那么加入NUL并在其上分离(通过$ IFS或其他)可以很好地工作.但是几个常见的炮弹,包括猛击,打破了NUL.测试将是我的一个旧的.sig:
foo=$'a\0b'; [ ${#foo} -eq 3 ] && echo "$0 rocks"
Run Code Online (Sandbox Code Playgroud)
即使这对你有用,你也只是达到了一个警示标志,即是时候切换到更结构化的语言(Python,Perl,Ruby,Lua,Javascript ......选择你喜欢的毒药).您的代码可能难以维护; 即使你可以,也有一小部分人能够很好地理解它以维持它.