我需要一个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或更高版本,我们可以使用name将nameref属性赋值给变量declare -n,以便变量实际上是对另一个变量的引用:
...
declare -n myresult=$3
myresult="$__fileName.$__type.$ext.log"
...
Run Code Online (Sandbox Code Playgroud)
更好的方法是选择一个你可以一直使用的通用变量。例子:
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)
仅仅为了从函数中获取值而调用 subshell 是非常低效和缓慢的。
| 归档时间: |
|
| 查看次数: |
23000 次 |
| 最近记录: |