BASH脚本传递键值数组
嘿,试图向我的Bash脚本传递一个数组并同时回显key和value,但是key被回显为int,有什么解释吗:-) 脚本: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
#!/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