2016-09-22 7 views
0

私はシステムをcatと呼んで、結果を収集し、情報を保存する前にいくつかの関連情報を解析して、かなりうまくいくように見える非常に単純なshスクリプトを持っています。しかし、私が情報を保存しているforループを終了するとすぐに、arrayはそれ自身をクリアしているようです。私はarrayにforループの外で間違ってアクセスしているのだろうかと思います。スクリプトの関連部分:シェル配列が不明な理由で消去されました

#!/bin/sh 

    declare -a QSPI_ARRAY=() 

    cat /proc/mtd | while read mtd_instance 
    do 
     # split result into individiual words 
     words=($mtd_instance) 
     for word in "${words[@]}" 
     do 
      # check for uboot 
      if [[ $word == *"uboot"* ]] 
      then 
       mtd_num=${words[0]} 
       index=${mtd_num//[!0-9]/} # strip everything except the integers 
       QSPI_ARRAY[$index]="uboot" 
       echo "QSPI_ARRAY[] at index $index: ${QSPI_ARRAY[$index]}" 

      elif [[ $word == *"fpga_a"* ]] 
      then 
       echo "found it: "$word"" 
       mtd_num=${words[0]} 
       index=${mtd_num//[!0-9]/} # strip everything except the integers 
       QSPI_ARRAY[$index]="fpga_a" 
       echo "QSPI_ARRAY[] at index $index: ${QSPI_ARRAY[$index]}" 

      # other items are added to the array, all successfully 

      fi 
     done 
     echo "length of array: ${#QSPI_ARRAY[@]}" 
     echo "----------------------" 
    done 

私の出力はforループを終了するまで素晴らしいです。 forループ内では、arrayのサイズが増え、アイテムが追加されたことを確認できます。

dev: size erasesize name 

    length of array: 0 
    ------------- 
    mtd0: 00100000 00001000 "qspi-fsbl-uboot" 

    QSPI_ARRAY[] at index 0: uboot 

    length of array: 1 
    ------------- 
    mtd1: 00500000 00001000 "qspi-fpga_a" 

    QSPI_ARRAY[] at index 1: fpga_a 

    length of array: 2 
    ------------- 

    RESULTING ARRAY: 
    length of array: 0 
    qspi instance: 

EDIT:ここ

echo "RESULTING ARRAY:" 
    echo "length of array: ${#QSPI_ARRAY[@]}" 
    for qspi in "${QSPI_ARRAY}" 
    do 
     echo "qspi instance: $qspi" 
    done 

私の結果、私のディスプレイにecho Dは、以下のとおりです。いくつかのデバッグした後、私が持っているようだループの完了後、私はarrayそうのように確認してくださいここに何とか2つの異なるarrayがあります。私はarrayを次のように初期化しました:QSPI_ARRAY=("a" "b" "c" "d" "e" "f" "g")と私のfor-loopの後にはarrayはまだa、b、cなどです。ここでは同じ名前の2つの異なるをどうやって作るのですか?

+2

あなたのシェバング:おそらくこのように、あなたの例のコードの特定の場合には

while read mtd_instance do ... done < <(cat /proc/mtd) 

、私はあなたがややそれを簡略化することができると思う。それでも、このように見えること、一例としてcatを使用してそれはまったく使われ、 '#!/ bin/bash'である必要があります。 '/ bin/sh'は配列をサポートしません。 – chepner

答えて

1

この構造:

cat /proc/mtd | while read mtd_instance 
do 
... 
done 

dodoneの間で来るものは何でもであるシェル環境内の任意の効果を持っていないことを意味しまだそこにはdoneの後です。

whileループがパイプの右側にあるという事実(|)は、それがサブシェルで実行されていることを意味します。ループが終了すると、サブシェルも終了します。そしてそのすべての可変設定。

変更を繰り返すwhileループを使用する場合は、パイプを使用しないでください。入力のリダイレクトは、サブシェルを作成せず、この場合には、あなただけの直接ファイルから読み込むことができます。

while read mtd_instance 
do 
... 
done </proc/mtd 

あなたがcatよりも複雑なコマンドを持っていた場合、あなたはプロセスの置換を使用する必要があるかもしれません。場合は、

#!/usr/bin/env bash  
QSPI_ARRAY=() 
while read -a words; do␣ 
    declare -i mtd_num=${words[0]//[!0-9]/} 
    for word in "${words[@]}"; do 
    for type in uboot fpga_a; do 
     if [[ $word == *$type* ]]; then 
     QSPI_ARRAY[mtd_num]=$type 
     break 2 
     fi 
    done 
    done 
done </proc/mtd 
関連する問題