我需要一个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.那种情况没有发生。
答案 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"
}