引用名称包含点的 bash 变量

问题描述 投票:0回答:6

我有一个 bash 变量:

agent1.ip
,其值为
192.168.100.137
。当我在
echo
中这样引用它时:

echo $agent1.ip

结果是:

.ip

如何获取该值?

更新:我的变量是:

enter image description here

bash
6个回答
22
投票

Bash 本身不理解带点的变量名称,但这并不意味着您的环境中不能有这样的变量。 以下是如何设置并将其全部整合在一起的示例:

env 'agent1.ip=192.168.100.137' bash -c 'env | grep ^agent1\\.ip= | cut -d= -f2-'

14
投票

由于

bash.ip
不是
bash
中的有效标识符,因此环境字符串
bash.ip=192.168.100.37
不用于在 shell 启动时创建 shell 变量。

我会使用标准工具

awk
从环境中提取价值。

bash_ip=$(awk 'BEGIN {print ENVIRON["bash.ip"]}')

9
投票

最干净的解决方案是:

echo path.data | awk '{print ENVIRON[$1]}'

5
投票

您的代码是否嵌套,并使用使用 ksh 的函数或脚本?

点分变量名是 ksh93 中的一项高级功能。一个简单的案例是

$ a=1
$ a.b=123
$ echo ${a.b}
123
$ echo $a
1

如果您第一次尝试分配给

a.b
,您将得到

 -ksh: a.b=123: no parent

IHTH


4
投票

试试这个:

export myval=`env | grep agent1.port | awk -F'=' '{print $2}'`;echo $myval

0
投票

为了以可读的方式访问环境变量,我将为其创建一个 shell 函数:

getenv() { 
    awk 'BEGIN {print ENVIRON[ARGV[1]]}' "$1";
}

然后您可以将其用作

$ getenv agent1.ip
192.168.100.137
$ myvar=$(getenv agent1.ip)
$ echo "$myvar"
192.168.100.137

与已接受答案的差异是:

  • 稳健性:还支持变量值中的换行符(
    grep
    cut
    适用于行)
  • 效率:管道中只有 1 个分支 (
    awk
    ),而不是 3 个 (
    env
    grep
    cut
    )(还必须设置 I/O 缓冲区)

还有一个问题是关于导出带点(.)的变量
简短的回答:你不能,但你不需要,除了调用另一个可执行文件。在这种情况下,请使用

env

© www.soinside.com 2019 - 2024. All rights reserved.