Arrays 无法使用';删除数组元素;读取-n1';字符作为数组索引

Arrays 无法使用';删除数组元素;读取-n1';字符作为数组索引,arrays,bash,element,unset,Arrays,Bash,Element,Unset,我正试图根据“123”形式的脚本参数在bash中动态地从数组中删除元素,其中参数中的每个单位数都被假定为应该删除的数组的索引 #!/bin/bash # Doesn't delete an element. ARRAY=(a b c) while getopts ":a:" opt; do # run e.g. 'thisscript.h -a 0' case $opt in a) echo -n $OPTARG |\

我正试图根据“123”形式的脚本参数在bash中动态地从数组中删除元素,其中参数中的每个单位数都被假定为应该删除的数组的索引

#!/bin/bash
# Doesn't delete an element.
ARRAY=(a b c)
while getopts ":a:" opt; do # run e.g. 'thisscript.h -a 0'
    case $opt in
        a)
            echo -n $OPTARG |\
                while read -n 1 c; do
                    unset ARRAY[$c]
                done
                ;;
    esac
done
echo ${ARRAY[@]}
# Deletes an element successfully.
ARRAY=(a b c)
unset ARRAY[0]
echo ${ARRAY[@]}
# Deletes an element successfully.
ARRAY=(a b c)
n=0
unset ARRAY[$n]
echo ${ARRAY[@]}
将其写入例如tmp.sh文件chmod+x tmp.sh以使其可执行,然后运行“tmp.sh-a 0”


为什么第一个数组元素删除方法不起作用,我如何使它在“read-n1”上下文中起作用?

问题是作为子shell运行的管道while read循环。因此,
unset
发生在子shell中,并在子shell退出时消失。这就是为什么对数组变量没有影响

此问题在《高级Bash脚本编写指南》的第页中进行了描述

这里有一个解决方法,使用进程替换而不是管道

while read -n 1 c; do
    unset ARRAY[$c]
done < <(echo -n $OPTARG)
读取时-n1c;做
未设置数组[$c]

完成<多么有趣-非常感谢您对罗布麻的解释。我想了解double'