首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shell脚本函数返回字符串

shell脚本函数返回字符串
EN

Stack Overflow用户
提问于 2012-08-01 19:35:11
回答 3查看 26.8K关注 0票数 5

我是shell脚本的新手,我正在尝试创建一个简单的函数,它将返回作为参数传递的两个字符串。我试着用下面的代码

代码语言:javascript
复制
   function getConcatenatedString() {
       echo "String1 $1"
       echo "String2 $2"
       str=$1/$2
       echo "Concatenated String ${str}"
       echo "${str}"
   }

//我正在调用上述函数

代码语言:javascript
复制
  constr=$(getConcatenatedString "hello" "world")
  echo "printing result"
  echo "${constr}"
  echo "exit"

当使用上面的代码运行脚本时,我看到了下面的输出。

代码语言:javascript
复制
   printing result
   String1 hello
   String2 world
   Concatenated String hello/world
   hello/world
   exit

如果你看一下代码,我首先调用函数,然后回显“打印结果”语句,但结果是首先出现“打印结果”,并在函数内部回显语句。是下面的语句调用函数

代码语言:javascript
复制
   constr=$(getConcatenatedString "hello" "world")

代码语言:javascript
复制
   echo ${constr}

是否正在调用函数?

因为如果我注释掉#echo ${constr},那么什么都不会被回显!请给我澄清一下。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-01 19:39:03

第一种方法是调用函数并将所有输出(四个echo语句)存储到$constr中。

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

这就是$()的工作方式,它从附带的命令中捕获完整的标准输出。

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

代码语言:javascript
复制
echo "String1 $1" >&2
票数 10
EN

Stack Overflow用户

发布于 2012-08-01 22:19:02

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

代码语言:javascript
复制
getConcatenatedString() { str="$1/$2"; }      
getConcatenatedString hello world
echo "Concatenated String ${str}"

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-09 21:56:28

一种更灵活但稍难理解的方法是传递变量名,并使用eval,以便在调用者的上下文(全局或函数局部)中设置变量。在bash中:

代码语言:javascript
复制
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替换为:

代码语言:javascript
复制
declare -g $_varname="$_t"

eval方法类似于TCL's upvar 1declare -g类似于upvar #0

一些shell内置支持类似的东西,比如bash的printf带有"-v",通过直接赋值给变量而不是捕获输出来节省进程创建(对我来说速度大约快20-25倍)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11758368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档