为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Bash函数返回字符串值

/ 猿问

如何从Bash函数返回字符串值

吃鸡游戏 2019-11-21 14:30:24

我想从Bash函数返回一个字符串。


我将用Java编写示例以显示我想做的事情:


public String getSomeString() {

  return "tadaa";

}


String variable = getSomeString();

下面的示例在bash中有效,但是有更好的方法吗?


function getSomeString {

   echo "tadaa"

}


VARIABLE=$(getSomeString)

字符串 bash 函数的 返回值


查看完整描述

3 回答

?
繁花如伊

您可以让函数将变量作为第一个arg,然后使用要返回的字符串修改变量。


#!/bin/bash

set -x

function pass_back_a_string() {

    eval "$1='foo bar rab oof'"

}


return_var=''

pass_back_a_string return_var

echo $return_var

打印“ foo bar rab oof”。


编辑:在适当的位置添加了引号,以允许字符串中的空格解决@Luca Borrione的评论。


编辑:作为演示,请参阅以下程序。这是一个通用的解决方案:它甚至允许您将字符串接收到局部变量中。


#!/bin/bash

set -x

function pass_back_a_string() {

    eval "$1='foo bar rab oof'"

}


return_var=''

pass_back_a_string return_var

echo $return_var


function call_a_string_func() {

     local lvar=''

     pass_back_a_string lvar

     echo "lvar='$lvar' locally"

}


call_a_string_func

echo "lvar='$lvar' globally"

打印:


+ return_var=

+ pass_back_a_string return_var

+ eval 'return_var='\''foo bar rab oof'\'''

++ return_var='foo bar rab oof'

+ echo foo bar rab oof

foo bar rab oof

+ call_a_string_func

+ local lvar=

+ pass_back_a_string lvar

+ eval 'lvar='\''foo bar rab oof'\'''

++ lvar='foo bar rab oof'

+ echo 'lvar='\''foo bar rab oof'\'' locally'

lvar='foo bar rab oof' locally

+ echo 'lvar='\'''\'' globally'

lvar='' globally

编辑:这表明原始变量的值是在功能可用,进行了错误@Xichen李在评论批评。


#!/bin/bash

set -x

function pass_back_a_string() {

    eval "echo in pass_back_a_string, original $1 is \$$1"

    eval "$1='foo bar rab oof'"

}


return_var='original return_var'

pass_back_a_string return_var

echo $return_var


function call_a_string_func() {

     local lvar='original lvar'

     pass_back_a_string lvar

     echo "lvar='$lvar' locally"

}


call_a_string_func

echo "lvar='$lvar' globally"

这给出了输出:


+ return_var='original return_var'

+ pass_back_a_string return_var

+ eval 'echo in pass_back_a_string, original return_var is $return_var'

++ echo in pass_back_a_string, original return_var is original return_var

in pass_back_a_string, original return_var is original return_var

+ eval 'return_var='\''foo bar rab oof'\'''

++ return_var='foo bar rab oof'

+ echo foo bar rab oof

foo bar rab oof

+ call_a_string_func

+ local 'lvar=original lvar'

+ pass_back_a_string lvar

+ eval 'echo in pass_back_a_string, original lvar is $lvar'

++ echo in pass_back_a_string, original lvar is original lvar

in pass_back_a_string, original lvar is original lvar

+ eval 'lvar='\''foo bar rab oof'\'''

++ lvar='foo bar rab oof'

+ echo 'lvar='\''foo bar rab oof'\'' locally'

lvar='foo bar rab oof' locally

+ echo 'lvar='\'''\'' globally'

lvar='' globally


查看完整回答
反对 回复 2019-11-21
?
弑天下

上面的所有答案都忽略了bash手册页中所述的内容。


在函数内部声明的所有变量将与调用环境共享。

所有声明为local的变量将不会共享。

范例程式码


#!/bin/bash


f()

{

    echo function starts

    local WillNotExists="It still does!"

    DoesNotExists="It still does!"

    echo function ends

}


echo $DoesNotExists #Should print empty line

echo $WillNotExists #Should print empty line

f                   #Call the function

echo $DoesNotExists #Should print It still does!

echo $WillNotExists #Should print empty line

并输出


$ sh -x ./x.sh

+ echo


+ echo


+ f

+ echo function starts 

function starts

+ local 'WillNotExists=It still does!'

+ DoesNotExists='It still does!'

+ echo function ends 

function ends

+ echo It still 'does!' 

It still does!

+ echo

同样在pdksh和ksh下,此脚本也可以实现!


查看完整回答
反对 回复 2019-11-21
?
波斯汪

我没有更好的方法了。Bash仅知道状态代码(整数)和写入标准输出的字符串。


查看完整回答
反对 回复 2019-11-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信