0

我正在尝试根据“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 -n 1”上下文中起作用?

4

1 回答 1

1

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

这个问题在第 20.2 节中描述。重定向高级 Bash 脚本指南的代码块。

这是一种解决方法,使用进程替换而不是管道。

while read -n 1 c; do
    unset ARRAY[$c]
done < <(echo -n $OPTARG)
于 2012-01-09T10:01:51.360 回答