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

Ash*_*win 10 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"
Run Code Online (Sandbox Code Playgroud)

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

# echo $(makeName "type1")
Run Code Online (Sandbox Code Playgroud)

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

And*_*ter 16

使用的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
Run Code Online (Sandbox Code Playgroud)

[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
Run Code Online (Sandbox Code Playgroud)
$ ./sample.sh 
Enter fileName:filename
Enter Ext: ext1
Enter Ext: ext2
filename.type1.ext1.log
filename.type2.ext2.log
Run Code Online (Sandbox Code Playgroud)

然而,更好,更清洁的代码,并避免使用自己的函数中的全局变量,你可以使用在所描述的方法从Bash函数返回值传递返回变量作为参数的名称,最好也通过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
Run Code Online (Sandbox Code Playgroud)

旁注:请参阅为什么要在Bash中避免eval,我应该使用什么呢?讨论为什么eval要避免.使用bash 3.1或更高版本时,您可以使用printf而不是eval:

...
printf -v "$__resultvar" '%s' "$myresult"
...
Run Code Online (Sandbox Code Playgroud)

最后,使用bash 4.3或更高版本,我们可以使用namenameref属性赋值给变量declare -n,以便变量实际上是对另一个变量的引用:

...
declare -n myresult=$3

myresult="$__fileName.$__type.$ext.log"
...
Run Code Online (Sandbox Code Playgroud)


kon*_*box 5

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

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

echo -n "Enter fileName:"
read fileName

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

echo "$name1"
echo "$name2"
Run Code Online (Sandbox Code Playgroud)

仅仅为了从函数中获取值而调用 subshel​​l 是非常低效和缓慢的。