Невозможно удалить элемент массива, используя символ 'read -n 1' в качестве индекса массива - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь динамически удалять элементы из массива в bash на основе аргумента сценария в форме '123', где предполагается, что каждое однозначное число в аргументе является индексом массива, который должен быть удален.

#!/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 Ответ

1 голос
/ 09 января 2012

Проблема заключается в цикле PIPED while-read, который работает как подоболочка.Поэтому unset происходит в подоболочке и исчезает при выходе из подоболочки.Вот почему это не влияет на переменную массива.

Эта проблема описана в Раздел 20.2.Перенаправление кодовых блоков Расширенного руководства по написанию сценариев.

Вот один из обходных путей, использующий замену процесса вместо канала.

while read -n 1 c; do
    unset ARRAY[$c]
done < <(echo -n $OPTARG)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...