我是shell脚本的新手,我正在尝试创建一个简单的函数,它将返回作为参数传递的两个字符串。我试着用下面的代码
function getConcatenatedString() {
echo "String1 $1"
echo "String2 $2"
str=$1/$2
echo "Concatenated String ${str}"
echo "${str}"
}//我正在调用上述函数
constr=$(getConcatenatedString "hello" "world")
echo "printing result"
echo "${constr}"
echo "exit"当使用上面的代码运行脚本时,我看到了下面的输出。
printing result
String1 hello
String2 world
Concatenated String hello/world
hello/world
exit如果你看一下代码,我首先调用函数,然后回显“打印结果”语句,但结果是首先出现“打印结果”,并在函数内部回显语句。是下面的语句调用函数
constr=$(getConcatenatedString "hello" "world")或
echo ${constr}是否正在调用函数?
因为如果我注释掉#echo ${constr},那么什么都不会被回显!请给我澄清一下。
发布于 2012-08-01 19:39:03
第一种方法是调用函数并将所有输出(四个echo语句)存储到$constr中。
然后,返回后,回显前同步码printing result、$constr (由四行组成)和退出消息。
这就是$()的工作方式,它从附带的命令中捕获完整的标准输出。
听起来您希望在控制台上看到一些echo语句,而不是使用$()捕获它们。我认为您应该能够将它们发送到标准错误:
echo "String1 $1" >&2发布于 2012-08-01 22:19:02
paxdiablo的解决方案是正确的。不能从函数返回字符串,但可以捕获函数的输出,或者返回调用者可以从$?检索的整数值。但是,由于所有shell变量都是全局变量,您可以简单地执行以下操作:
getConcatenatedString() { str="$1/$2"; }
getConcatenatedString hello world
echo "Concatenated String ${str}"请注意,对于(),function关键字是多余的,但function的可移植性较差。
发布于 2013-01-09 21:56:28
一种更灵活但稍难理解的方法是传递变量名,并使用eval,以便在调用者的上下文(全局或函数局部)中设置变量。在bash中:
function mylist()
{
local _varname=$1 _p _t
shift
for _p in "$@"; do
_t=$_t[$_p]
done
eval "$_varname=\$_t"
}
mylist tmpvar a b c
echo "result: $tmpvar"在我的Linux桌面(bash-3.2)上,它大约比使用``快3-5倍(10,000次迭代),因为后者有创建进程的开销。
如果您使用的是bash-4.2,那么它的declare -g允许一个函数设置全局变量,因此您可以将不美观的eval替换为:
declare -g $_varname="$_t"eval方法类似于TCL's upvar 1,declare -g类似于upvar #0。
一些shell内置支持类似的东西,比如bash的printf带有"-v",通过直接赋值给变量而不是捕获输出来节省进程创建(对我来说速度大约快20-25倍)。
https://stackoverflow.com/questions/11758368
复制相似问题