BASH脚本传递键值数组

时间:2017-10-03 10:53:29

标签: bash

嘿试图将一个数组传递给我的Bash脚本并回显键和值,但是键被回显为int,可以解释原因: - )

脚本:

#!/bin/bash
string=$1 && shift
array=($@)

for i in "${!array[@]}"
do
  echo "key  :" $i
  echo "value:" ${array[$i]}
done

运行脚本:

:~$ declare -A arr
:~$ arr["key1"]=Value1
:~$ ./test.sh bar ${arr[@]}
    key  : 0
    value: value1

另外为什么我需要做这一行(string = $ 1 $$ shift)在其他一些线程中发现这个,但不确定我理解为什么,第一个参数不能成为数组?

2 个答案:

答案 0 :(得分:3)

你没有通过数组;您只传递存储在数组中的值。实际上,你不能将数组作为一个整体传递,因为shell中没有数组值,只有设置了数组属性的名称。

要执行您想要的操作,您必须将数组用作全局变量,这意味着您只能使用函数而不是脚本执行此操作。此外,尽管可以单独使用间接参数扩展,但使用namerefs更简单(需要/bin/java -Xms5g -Xmx5g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-2.4.5.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch start -Des.pidfile=/var/run/elasticsearch/elasticsearch.pid -Des.default.path.home=/usr/share/elasticsearch -Des.default.path.logs=/var/log/elasticsearch -Des.default.path.data=/var/lib/elasticsearch -Des.default.path.conf=/etc/elasticsearch 4.3或更高版本):

bash

请注意,如果foo () { declare -n a=$1 for key in "${!a[@]}"; do echo "key: $key" echo "value: ${a[$key]}" done } 命令设置的内部数组名称与您尝试传递的全局数组相同,则会出现循环名称引用错误; 警告经纪人

要创建一系列交替的键和值以作为单独的参数传递,请使用常规数组。

declare

(注意:我不记得是否以任何特定顺序存储或迭代数组键;假设它们不是。)

declare -A arr arr[romeo]="John Doe" arr[juliet]="Jane Smith" kvpairs=() for k in "${!arr[@]}"; do kvpairs+=( "$k" "${arr[$k]}" ) done ./test.sh "${kvpairs[@]}" 内,您可以重建数组:

test.sh

答案 1 :(得分:0)

首先,shift用于将参数的位置移位1,以便将$ 1的值转移到$ 0,依此类推。这样做是因为数组从bash中的位置0开始。

接下来,不要使用$i打印索引位置,而是使用${!i}。这将打印索引名称而不是索引位置编号。