0

「123」という形式のスクリプト引数に基づいて、bash の配列から要素を動的に削除しようとしています。引数の各 1 桁の数字は、削除する必要がある配列のインデックスであると見なされます。

#!/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サブシェルで発生し、サブシェルが終了すると消えます。そのため、配列変数に影響はありません。

この問題は、セクション 20.2 で説明されています。高度な Bash スクリプト ガイドのコード ブロックのリダイレクト。

パイプの代わりにプロセス置換を使用する 1 つの回避策を次に示します。

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