shell脚本函数返回一个字符串(shell script function return a st

2019-06-26 16:33发布

我是新来的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 $ {}构造什么,然后是越来越呼应! 请澄清我。

Answer 1:

首先是调用函数和所有的输出(四个存储echo陈述)到$constr

然后,返回后,您呼应序言printing result$constr (包括四线)和退出消息。

这是如何$()的作品,它抓住了从封闭命令标准输出的全部。

这听起来像你想看到一些的echo在控制台上的陈述,而不是与他们捕捉$() 我觉得你就应该能够把他们送到标准误差为:

echo "String1 $1" >&2


Answer 2:

paxdiablo的解决方案是正确的。 你不能从一个函数返回一个字符串,但您可以捕获函数的输出或返回可从主叫方检索的整数值$? 。 然而,由于所有shell变量是全局的,你可以简单地做:

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

请注意, function关键字是冗余的()function是少便携式的。



Answer 3:

更灵活,但略有更难理解的方法是通过一个变量名,并使用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允许一个函数来设置一个全局变量,所以你可以替换unpretty eval有:

declare -g $_varname="$_t"

eval方法类似于TCL的 upvar 1 ,并declare -g类似于upvar #0

有些shell内建支持类似的东西,比如bash的printf带有“-v”,再通过直接分配给一个变量,而不是捕捉输出(〜20-25x快对我来说)保存过程创建。



文章来源: shell script function return a string
标签: linux shell unix