我是shell脚本的新手,我正在尝试创建一个简单的函数,它将返回作为参数传递的连接的两个字符串。我试过下面的代码
function getConcatenatedString() {
echo "String1 $1"
echo "String2 $2"
str=$1/$2
echo "Concatenated String ${str}"
echo "${str}"
}
//我正在调用上面的函数
constr=$(getConcatenatedString "hello" "world")
echo "printing result"
echo "${constr}"
echo "exit"
使用上面的代码
运行脚本时,我看到以下输出 printing result
String1 hello
String2 world
Concatenated String hello/world
hello/world
exit
如果你看代码我首先调用函数然后我回显“打印结果”语句,但结果首先是“打印结果”并回显函数内部的语句。以下语句是否调用函数
constr=$(getConcatenatedString "hello" "world")
或
echo ${constr}
正在调用函数吗?
因为如果我注释掉#echo $ {constr}那么没有什么可以回应!!!请澄清一下。
答案 0 :(得分:10)
第一个是调用该函数并将输出的所有(四个echo
语句)存储到$constr
。
然后,在返回之后,您回显前导码printing result
,$constr
(由四行组成)和退出消息。
这就是$()
的工作原理,它从封闭的命令中捕获整个标准输出。
听起来您希望在控制台上看到一些echo
语句,而不是使用$()
捕获它们。我认为你应该能够将它们发送给标准错误:
echo "String1 $1" >&2
答案 1 :(得分:1)
paxdiablo的解决方案是正确的。您不能从函数返回字符串,但是您可以捕获函数的输出或返回调用者可以从$?
检索的整数值。但是,由于所有shell变量都是全局变量,因此您可以执行以下操作:
getConcatenatedString() { str="$1/$2"; }
getConcatenatedString hello world
echo "Concatenated String ${str}"
请注意,function
关键字对()
是多余的,但function
的可移植性较差。
答案 2 :(得分:1)
更灵活但更难理解的方法是传递变量名称,并使用eval
以便变量在调用者的上下文中设置(全局或函数本地)。在bash:
function mylist()
{
local _varname=$1 _p _t
shift
for _p in "$@"; do
_t=$_t[$_p]
done
eval "$_varname=\$_t"
}
mylist tmpvar a b c
echo "result: $tmpvar"
在我的Linux桌面(bash-3.2)上,它比使用``
快约3-5倍(10,000次迭代),因为后者有进程创建开销。
如果你有bash-4.2,它的declare -g
允许一个函数设置一个全局变量,所以你可以用以下代码替换不成熟的eval
:
declare -g $_varname="$_t"
eval
方法与TCL's upvar 1
类似,declare -g
类似于upvar #0
。
一些shell内置函数支持类似的东西,比如bash的printf
和“-v”,再次通过直接分配给变量而不是捕获输出来保存进程创建(对我来说快20~25倍)。