Bash:从bash函数返回一个字符串

时间:2014-07-10 12:27:25

标签: linux bash

我需要一个bash函数来返回一个动态构造的字符串以返回给调用者空间。 即,

makeName()
{
    echo "Enter Ext: "
    read ext
    return "$fileName.$1.$ext.log"
}


echo -n "Enter fileName:"
read fileName

name1=makeName "type1"
name2=makfName "type2"

所以我可以获得两个具有相同基本文件名的不同文件名。 我试着这样做,

# echo $(makeName "type1")

但是这个代码在没有任何理由或错误的情况下被攻击。我希望它也可以接受某种I / O.那种情况没有发生。

3 个答案:

答案 0 :(得分:14)

return使用的bash语句用于返回数值作为状态代码,由调用函数通过$?检索。你不能返回一个字符串。另见

你可以使用@konsolebox提出的特殊全局变量,或echo函数内的返回值,并在调用函数时使用命令替换:

makeName()
{
    echo "$fileName.$1.log"
}


echo -n "Enter fileName:"
read fileName

name1=$(makeName "type1")
name2=$(makeName "type2")

echo $name1
echo $name2

<强> [UPDATE]

更新后的问题显示您打算在makeName函数中读取另一个值,而该函数还打算echo向用户提示某些提示。因此命令替换方法在这种情况下不起作用 - 您需要使用全局变量,如

makeName() {
    echo -n "Enter Ext: "
    read ext

    __="$fileName.$1.$ext.log"
}


echo -n "Enter fileName:"
read fileName

makeName "type1" ; name1=${__}
makeName "type2" ; name2=${__}

echo $name1
echo $name2
$ ./sample.sh 
Enter fileName:filename
Enter Ext: ext1
Enter Ext: ext2
filename.type1.ext1.log
filename.type2.ext2.log

更好的是,为了更清晰的代码并避免在函数中使用全局变量,您可以使用Returning Values from Bash Functions中描述的方法和将返回变量的名称作为参数传递,并且理想情况下也会将fileName作为参数传递:

makeName() {
    local  __type=$1
    local  __fileName=$2
    local  __resultvar=$3
    local ext
    local myresult

    echo -n "Enter Ext: "
    read ext
    myresult="$__fileName.$__type.$ext.log"

    eval $__resultvar="'$myresult'"
}

echo -n "Enter fileName:"
read fileName

makeName "type1" $fileName theResult ; name1=${theResult}
makeName "type2" $fileName theResult ; name2=${theResult}
echo $myresult

echo $name1
echo $name2

旁注:有关为何应避免eval的讨论,请参阅Why should eval be avoided in Bash, and what should I use instead?。使用bash 3.1或更高版本时,您可以使用printf代替eval

...
printf -v "$__resultvar" '%s' "$myresult"
...

最后,使用bash 4.3或更高版本,我们可以使用declare -n nameref 属性分配给变量,以便变量实际上是引用到另一个变量:

...
declare -n myresult=$3

myresult="$__fileName.$__type.$ext.log"
...

答案 1 :(得分:4)

更好的方法是选择一直可以使用的通用变量。例如:

makeName() {
    __="$fileName.$1.log"
}    

echo -n "Enter fileName:"
read fileName

makeName "type1"
name1=$__
makeName "type2"
name2=$__

echo "$name1"
echo "$name2"

为了从函数中获取值而召唤子shell实际上效率低且速度慢。

答案 2 :(得分:0)

只需将return替换为echo

makeName()
{
    echo "Enter Ext: " >&2
    read ext
    echo "$fileName.$1.$ext.log"
}