嘿试图将一个数组传递给我的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)在其他一些线程中发现这个,但不确定我理解为什么,第一个参数不能成为数组?
答案 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}
。这将打印索引名称而不是索引位置编号。