无法使用“read -n 1”字符作为数组索引删除数组元素

时间:2012-01-09 09:50:21

标签: arrays bash element unset

我正在尝试基于形式为'123'的脚本参数在bash中动态删除数组中的元素,其中参数中的每个单个数字都被假定为应该删除的数组的索引。 / p>

#!/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 -n 1'上下文中工作?

1 个答案:

答案 0 :(得分:1)

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

高级Bash-Scripting Guide的Section 20.2. Redirecting Code Blocks中描述了此问题。

以下是一种解决方法,使用流程替换而不是管道。

while read -n 1 c; do
    unset ARRAY[$c]
done < <(echo -n $OPTARG)