我是新来的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 $ {}构造什么,然后是越来越呼应! 请澄清我。
首先是调用函数和所有的输出(四个存储echo
陈述)到$constr
。
然后,返回后,您呼应序言printing result
, $constr
(包括四线)和退出消息。
这是如何$()
的作品,它抓住了从封闭命令标准输出的全部。
这听起来像你想看到一些的echo
在控制台上的陈述,而不是与他们捕捉$()
我觉得你就应该能够把他们送到标准误差为:
echo "String1 $1" >&2
paxdiablo的解决方案是正确的。 你不能从一个函数返回一个字符串,但您可以捕获函数的输出或返回可从主叫方检索的整数值$?
。 然而,由于所有shell变量是全局的,你可以简单地做:
getConcatenatedString() { str="$1/$2"; }
getConcatenatedString hello world
echo "Concatenated String ${str}"
请注意, function
关键字是冗余的()
但function
是少便携式的。
更灵活,但略有更难理解的方法是通过一个变量名,并使用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
允许一个函数来设置一个全局变量,所以你可以替换unpretty eval
有:
declare -g $_varname="$_t"
该eval
方法类似于TCL的 upvar 1
,并declare -g
类似于upvar #0
。
有些shell内建支持类似的东西,比如bash的printf
带有“-v”,再通过直接分配给一个变量,而不是捕捉输出(〜20-25x快对我来说)保存过程创建。