1

この bash 配列が読み込まれないのはなぜですか? 私は過去にこのようなことをしたと思います。エコー${#XECOMMAND[@]}してもデータが表示されません..

DIR=$1
TEMPFILE=/tmp/dir.tmp

ls -l $DIR | tail -n +2 |  sed 's/\s\+/ /g' | cut -d" " -f5,9 > $TEMPFILE


i=0
cat $TEMPFILE | while read line ;do

    if [[ $(echo $line | cut -d" " -f1) == 0 ]]; then

        XECOMMAND[$i]="$(echo "$line" | cut -d" " -f2)"
        (( i++ ))   
    fi

done
4

2 に答える 2

2

次のようにwhileループを実行すると

somecommand | while read ...

次に、while ループがサブシェルで実行されます。つまり、メイン スクリプトとは異なるプロセスです。したがって、ループで発生するすべての変数の割り当ては、メイン プロセスには反映されません。回避策は、現在のプロセスでループが実行されるように、入力リダイレクトやコマンド置換を使用することです。たとえば、ファイルから読み取りたい場合は、

while read ....
do
    # do stuff
done < "$filename"

または、実行できるプロセスの出力が必要ない場合

while read ....
do
    # do stuff
done < <(some command)

最後に、bash 4.2 以降では、 を設定できますshopt -s lastpipe。これにより、パイプラインの最後のコマンドが現在のプロセスで実行されます。

于 2013-08-21T15:07:46.490 に答える