Bash函数不返回值,因为它似乎并行运行

时间:2019-05-09 16:55:23

标签: bash

在一个函数中,我试图从一行文本中提取进程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

这里有一些问题:

  1. 两个echo语句似乎交织在一起,表明函数和主要作用域正在并行运行。这应该发生吗?可以将其关闭吗?
  2. 外部作用域从不获取进程ID的值。如您所见,它仅打印一次。通过测试,我知道打印函数ID 9040的只是函数内部的回显。外部范围似乎还没有获得进程ID。

这些问题的原因是什么?

1 个答案:

答案 0 :(得分:2)

您的假设在这里很复杂,在processId输出的变量$(..)中看到的是echo语句的输出,而 not 来自功能的return版的值。

您根本无法从bash中的函数返回字符串。来自0-255的无符号整数代码。如果只从函数中返回匹配的组,则省略return语句,只打印匹配的组

getPidFromRow() {
    # Your other code here
    # ..
    printf '%d\n' "$pid"
}