【问题标题】:How to print variable value inside a function in shell script?如何在shell脚本中的函数内打印变量值?
【发布时间】:2018-09-25 02:11:53
【问题描述】:

下面是我的脚本,我根据情况将值放入 local_server 变量中:

#!/bin/bash
servers=(machine981.abc.host.com luck123.pqr.host.com gond654.def.host.com)
case $(hostname -f) in
    *abc.host.com)
        local_server=("${servers[0]}")
        ;;
    *pqr.host.com)
        local_server=("${servers[1]}")
        ;;
    *def.host.com)
        local_server=("${servers[2]}")
        ;;
    *) echo "unknown host: $(hostname -f), exiting." && exit 1 ;;
    # ?
esac

# now this print works fine and it shows right value
echo $local_server

hello() {
  el=$1
  we=$2
  # but this print inside "hello" function doesn't print anything? Why?
  echo $local_server
}
export -f hello

parallel -j 3 hello {} $primary ::: ${pk[@]} &
parallel -j 3 hello {} $secondary ::: ${sk[@]} &

现在我有一个函数hello(),我想在其中使用local_server 变量,但看起来我不能使用它?它打印为空。这背后的原因是什么?如何在hello函数中打印local_server变量?

【问题讨论】:

  • 为我工作。您实际上是在某处调用hello 函数吗?它不在您问题的代码中。另外:h=$(hostname -f); for s in "${servers[@]}"; do [[ $s = *$h ]] && local_server="$s"; done
  • 编辑了我的问题以显示我如何称呼它?我正在使用gnu-parallel 来调用 hello 函数。
  • 啊,这很重要。 parallel 没有内置在 bash 中,因此 array $local_server 的内容无法导出。试着把它变成一个普通变量,不要忘记导出它。
  • 正常变量是什么意思?我不太明白。此外,您在第一条评论中给出的示例在某种程度上不起作用 - 因为我需要根据我是否有 abc.host.comdef.host.compqr.host.com 从服务器列表中选择机器。因此,如果当前主机名具有 abc.host.com,那么我将选择 local_server 作为 machine981.abc.host.com,其他主机名也是如此。
  • variable="value"$variable 赋值,这是一个普通的标量变量。 variable=("value") 为数组 ${variable[@]} 分配一个值,该值应使用此语法正确评估,并且无法导出。

标签: linux bash shell unix subprocess


【解决方案1】:

你有两个选择。导出变量:

export local_server

或使用 env_parallel:

env_parallel -j 3 hello {} $primary ::: ${pk[@]} &

(env_parallel 甚至复制数组、函数和别名 - 与您在 UNIX 中的习惯相反)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2022-01-18
    • 2014-06-24
    • 2014-09-19
    相关资源
    最近更新 更多