shell脚本函数返回一个字符串

时间:2012-08-01 11:35:11

标签: linux shell unix

我是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}那么没有什么可以回应!!!请澄清一下。

3 个答案:

答案 0 :(得分:10)

第一个是调用该函数并将输出的所有(四个echo语句)存储到$constr

然后,在返回之后,您回显前导码printing result$constr(由四行组成)和退出消息。

这就是$()的工作原理,它从封闭的命令中捕获整个标准输出。

听起来您希望在控制台上看到一些echo语句,而不是使用$()捕获它们。我认为你应该能够将它们发送给标准错误:

echo "String1 $1" >&2

答案 1 :(得分:1)

paxdiablo的解决方案是正确的。您不能从函数返回字符串,但是您可以捕获函数的输出或返回调用者可以从$?检索的整数值。但是,由于所有shell变量都是全局变量,因此您可以执行以下操作:

getConcatenatedString() { str="$1/$2"; }      
getConcatenatedString hello world
echo "Concatenated String ${str}"

请注意,function关键字对()是多余的,但function的可移植性较差。

答案 2 :(得分:1)

更灵活但更难理解的方法是传递变量名称,并使用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倍)。