迭代数组并向数组添加新项

迭代数组并向数组添加新项

我有一个数组设置:

target_array=(
    "item1 -a100 -b250 -caaa"
    "item2 -a110 -cbbb -d1sa"
    "item3 -d2sa -exxx -fyyy"
)

然后,我迭代该数组并执行各种操作:

for target_item in "${target_array[@]}"; do
    #Do Stuff Here
    #and create new items
    x=111
    y=222
    z=333
done

在循环内,我获得新变量并需要将它们添加到数组中,所以我最终会得到如下结果:

target_array=(
    "item1 -a100 -b250 -caaa -x111 -y222 -z333"
    "item2 -a110 -cbbb -d1sa -x112 -y223 -z334"
    "item3 -d2sa -exxx -fyyy -x113 -y224 -z335"
)

但如何将这些项目添加到数组中呢?我应该将它们添加到现有数组中,还是创建一个新数组?

powershell我正在尝试从其中使用包含项目(item1)和值为(100)的属性(-a)的“对象”移植脚本。但在 Linux 上找不到类似的东西,所以数组似乎是下一个最好的选择。

答案1

假设您正在使用,bash您可以使用索引(而不是值)和 Construction 来迭代数组${!array[@]},然后用新值替换每个元素:

for target_item in "${!target_array[@]}"; do
    x=111
    y=222
    z=333
    target_array["$target_item"]+=" -x$x -y$y -z$z"
done

不幸的是,不可能bash从数组元素的值中展开索引。


zsh可以使用特殊的所谓的来简化程序下标标志 (i)并正常循环数组:

for target_item in "${target_array[@]}"; do
     x=111                    
     y=222                    
     z=333
     i="${target_array[(i)$target_item]}"
     target_array[$i]+=" -x$x -y$y -z$z"
done

答案2

在循环中创建一个新数组,然后将原始数组设置为这个新数组:

target_array=(
    "item1 -a100 -b250 -caaa"
    "item2 -a110 -cbbb -d1sa"
    "item3 -d2sa -exxx -fyyy"
)

for target_item in "${target_array[@]}"; do
    # Do Stuff Here
    # and create new items
    x=111
    y=222
    z=333

    new_array+=( "$target_item -x$x -y$y -z$z" )
done

target_array=( "${new_array[@]}" )

使用/bin/sh(因为我更喜欢使用$@overbash有点庞大的数组语法所需的语法):

set -- \
    "item1 -a100 -b250 -caaa" \
    "item2 -a110 -cbbb -d1sa" \
    "item3 -d2sa -exxx -fyyy"

for target_item do
    # Do Stuff Here
    # and create new items
    x=111
    y=222
    z=333

    set -- "$@" "$target_item -x$x -y$y -z$z"
    shift
done

修改后的数组为"$@".

相关内容