2014-10-29 68 views
1

我爬过大量的电路板,但没有找到我的问题的最终解决方案。Bash,变量和数组

我有一个名为“array0”的数组,名称被存储到一个名为arrayname的变量中。我也有一个记录的IP地址,比如说127.0.0.1,也存储在一个名为ip的变量中。

现在我想的IP分配给指数3像数组中:

"$arrayname"[3]="$ip"  

所以,这没有奏效。我尝试了很多方法来解决这个问题,但都没有成功。
有谁可以告诉我这种情况下的最终解决方案?

更新:给定的机会来处理这个问题非常好!但我忘了提及我正在使用的数组只是源自另一个文件(也用bash编写)。我的目标是现在编辑源文件本身的数组。还有什么想法吗?

回答

5

尝试

read ${arrayname}[3] <<<"$ip" 
+2

+1所示我总是忘记你也可以读入数组的元素。 – chepner 2014-10-29 12:09:14

+1

不错。我无法决定我是否更喜欢这种'read'方法或chepner的'declare'方法。但两者都远远超出了基于评估的方法。 :) – 2014-10-29 12:20:35

+0

是的,谢谢,这工作很好!现在我的问题,我忘了说:数组存储在我用source命令访问的另一个文件中..那里数组由'declare -a array0'声明,然后0-2填充为'array0 = (value0 value1 value2)。如何将值打印到其他文件中的数组中? – dncrft 2014-10-29 12:30:39

-1

初始化数组后,您可以使用它们的索引访问数组元素,如下所示。 访问为:

${arrayname[3]} 
+1

你已经明白了dncrft问? – Jdamian 2014-10-29 12:06:57

+0

@Jdamian是的,我刚才展示了如何访问数组元素,它被错误地访问,如示例 – 2014-10-29 12:27:49

0

看到这个:

# declare -a arrayname=(element1 element2 element3) 
# echo ${arrayname[0]} 
    element1 
# arrayname[4]="Yellow" 
# echo ${arrayname[4]} 
    Yellow 
# export ip="192.168.190.23" 
# arrayname[5]=$ip 
# echo ${arrayname[5]} 
    192.168.190.23 

您不必使用引号。

+0

这并不回答问题。 – 2014-10-29 13:20:22

2

您需要使用declare命令和间接参数扩展,但使用数组名称有点棘手。如果将索引视为变量名称的部分,而不是应用于数组名称的运算符(如在大多数语言中那样),它会有所帮助。

array0=(1 2 3 4 5) 
arrayname=array0 
name=$arrayname[3] 
declare "$name=$ip" 
echo "${!name} 
+0

“声明”总是一个很好的窍门! – Jdamian 2014-10-29 12:10:09

+1

这是一个很好的诀窍,但是你必须确保'name'的内容是安全的。否则不好的事情可能发生。例如,尝试使用'name = $ arrayname [3]'替换'name = $ arrayname [$(ls>&2; echo 3)]''代替上面的代码。它仍然根据需要修改'array0',但它也有不必要的副作用。 :) – 2014-10-29 13:17:34

+1

嗯,这是设置'name'的值而不是'declare'的问题。 – chepner 2014-10-29 14:04:30

2

而又一种方式来做到这一点,这次使用多功能printf

printf -v "$arrayname[3]" %s "$ip" 

演示

#!/bin/bash 

array0=(a b c d e) 
echo "${array0[@]}" 

arrayname='array0' 
ip='127.0.0.1' 

printf -v "$arrayname[3]" %s "$ip" 
echo "${array0[@]}" 

输出

a b c d e 
a b c 127.0.0.1 e