修改数组函数参数Bash
Modify an Array Function Parameter Bash
我正在尝试修改作为参数传递给函数的数组。到目前为止,我在函数之外有一个空数组:
buckets=()
然后我有一个接受 2 个参数的函数。第一个参数是我要填充的空数组。第二个参数是包含我要用来填充数组的数据的文件的名称。
到目前为止,我所做的是创建一个临时数组。然后用文件的内容填充临时数组。我就是这样做的:
fillarray ()
{
# Declare the paramater as a temporary array
declare -a tempArray=("${!1}")
# Fill it up
while IFS= read -r entry; do
tempArray+=("$entry")
done < <(jq -r '.data | .[].name' )
最后一步是将参数数组(又名桶)设置为我们刚刚填充的临时数组的内容。关于如何进行此操作的任何建议?
在 BASH 4.3+ 中,您可以通过命名引用传递数组。所以你的函数可以简化为:
fillarray() {
# tempArray is a reference to array name in
local -n tempArray=""
while IFS= read -r entry; do
tempArray+=("$entry")
done < <(jq -r '.data | .[].name' "")
}
然后将其命名为:
buckets=()
fillarray buckets file.json
并将其测试为:
declare -p buckets
编辑: 要使其在 BASH 3.2 上运行,请使用以下代码段:
fillarray() {
# is current length of the array
i=
while IFS= read -r entry; do
read "[$i]" <<< "$entry"
((i++))
done < <(jq -r '.data | .[].name' "")
}
然后将其命名为:
buckets=()
fillarray buckets ${#buckets[@]} file.json
通过 eval
、
的另一种方式
fillarray () {
local tempArray;
while IFS= read -r entry; do
tempArray[${#tempArray[@]}]="$entry";
done < <(jq -r '.data | .[].name' );
eval =\('"${tempArray[@]}"'\);
}
我正在尝试修改作为参数传递给函数的数组。到目前为止,我在函数之外有一个空数组:
buckets=()
然后我有一个接受 2 个参数的函数。第一个参数是我要填充的空数组。第二个参数是包含我要用来填充数组的数据的文件的名称。
到目前为止,我所做的是创建一个临时数组。然后用文件的内容填充临时数组。我就是这样做的:
fillarray ()
{
# Declare the paramater as a temporary array
declare -a tempArray=("${!1}")
# Fill it up
while IFS= read -r entry; do
tempArray+=("$entry")
done < <(jq -r '.data | .[].name' )
最后一步是将参数数组(又名桶)设置为我们刚刚填充的临时数组的内容。关于如何进行此操作的任何建议?
在 BASH 4.3+ 中,您可以通过命名引用传递数组。所以你的函数可以简化为:
fillarray() {
# tempArray is a reference to array name in
local -n tempArray=""
while IFS= read -r entry; do
tempArray+=("$entry")
done < <(jq -r '.data | .[].name' "")
}
然后将其命名为:
buckets=()
fillarray buckets file.json
并将其测试为:
declare -p buckets
编辑: 要使其在 BASH 3.2 上运行,请使用以下代码段:
fillarray() {
# is current length of the array
i=
while IFS= read -r entry; do
read "[$i]" <<< "$entry"
((i++))
done < <(jq -r '.data | .[].name' "")
}
然后将其命名为:
buckets=()
fillarray buckets ${#buckets[@]} file.json
通过 eval
、
fillarray () {
local tempArray;
while IFS= read -r entry; do
tempArray[${#tempArray[@]}]="$entry";
done < <(jq -r '.data | .[].name' );
eval =\('"${tempArray[@]}"'\);
}