Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH脚本传递键值数组_Bash - Fatal编程技术网

BASH脚本传递键值数组

BASH脚本传递键值数组,bash,Bash,嘿,试图向我的Bash脚本传递一个数组并同时回显key和value,但是key被回显为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 :~$ ./tes

嘿,试图向我的Bash脚本传递一个数组并同时回显key和value,但是key被回显为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)在其他线程中发现了这一点,但我不知道为什么,第一个参数不能是数组?

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


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

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

要执行所需操作,必须将数组用作全局变量,这意味着您只能使用函数,而不能使用脚本。此外,虽然可以单独使用间接参数扩展,但使用namerefs(需要
bash
4.3或更高版本)要简单得多:

请注意,如果
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
内部,您可以重建阵列:

declare -A arr
while (( $# > 0 )); do
  arr["$1"]="$2"
  shift 2
done

嗯,那么我该如何传递一组用户,每个用户都有一个特定的关联值?我只能传递字符串和整数吗?thx for help
bash
只有一种数据类型:字符串。即使int也只是在某些上下文中被特殊处理的字符串。此外,用于调用程序的API只允许将字符串作为参数传递。传递所需数据的唯一方法是作为一系列单独的参数:
/test.sh alice 5 bob 9 charlie 2
.arghh:-)但好的,它会工作,对我来说可能更容易,因为这些参数来自Azure模板,所以现在我只需要弄清楚如何使用这些参数进行for循环。不幸的是,
bash
没有提供将关联数组扩展为键和值交替列表的方法(或者我忘记了);我将为答案添加一个变通方法。不工作:-(相反,它现在写入值而不是键。
declare -A arr
while (( $# > 0 )); do
  arr["$1"]="$2"
  shift 2
done