我正在尝试基于形式为'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'上下文中工作?
答案 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)