【发布时间】:2019-05-09 16:55:22
【问题描述】:
在一个函数中,我试图从一行文本中提取进程 ID。另外,我正在尝试返回该进程 ID:
#!/bin/bash
regex="[a-z]* ([0-9]+) .*"
indexRawRow="sahandz 9040 other stuff comes here"
getPidFromRow() {
if [[ $1 =~ $regex ]]
then
pid=${BASH_REMATCH[1]}
else
pid=""
fi
echo "pid is $pid inside function"
return $pid
}
processId=$(getPidFromRow "$indexRawRow")
echo "pid is $processId outside of function"
输出是:
pid is pid is 9040 inside function outside of function
这里有几个问题:
- 两条 echo 语句似乎交织在一起,表明函数和主作用域是并行运行的。这应该发生吗?可以关掉吗?
- 外部范围永远不会获取进程 ID 的值。如您所见,它只打印一次。通过测试,我知道打印进程ID 9040的只是函数内部的echo。外部范围似乎没有得到进程ID。
这些问题的原因是什么?
【问题讨论】:
-
outside of function来自哪里? -
是什么产生了文本
outside of function?这里没有并行运行。$(...)等待函数完成,然后将其标准输出用作分配给processID的值。如果要退出状态,在函数退出后查看$?的值。 -
一般来说,您不会像在其他语言中那样使用
return。它只能用于产生 0 到 255 之间的退出状态,而不是任意值。 -
如果你想写一些作为信息日志的东西,它属于 stderr,而不是 stdout。您写入标准输出的所有内容都是输出,因此在命令替换中被捕获并(在当前情况下)分配给变量
processId。 -
@Barmar:抱歉,我的编辑出现了错误。我已经更正了 bash 脚本,以便它生成与我指定的输出相同的输出
标签: bash