2011-09-16 5 views
0

シェルスクリプトでは非常に新しく、かなり配線されている問題が発生しました。シェルスクリプトでループの問題が発生した後も変数がまだ空です

#!/bin/bash 

list="" 

list=`mtx -f /dev/sg2 status | while read status 
do 
    result=$(echo ${status} | grep "Full") 
    if [ -z "$result" ]; then 
     continue 
    else 
     echo $(echo ${result} | cut -f3 -d' ' | tr -d [:alpha:] | tr -d [:punct:]) 
    fi 
done` 

echo ${list} 

for haha in ${list} 
do 
    printf "current slot is:%s \n" ${haha} 
done 

何プログラムはありませんが、それはmtx -f /dev/sg2 statusを実行していることであり、各ラインに行くとフルディスクがあるかどう参照してください。私はちょうどそれをここに投稿するように、プログラムはかなり単純です。その行に "Full"がある場合は、その行にスロット番号を記録し、listに入れます。

list=の後に6行目にバッククォートを入れて、それ以降は "while"ループ全体をカバーすることに注意してください。理由は私には不明ですが、私はちょうどそれを検索してこの使用法を得ました。 whileループは別のシェルなどを開くので、whileループが終了すると、ループ内で連結されたものはすべて失われてしまうので、最初の実装ではwhileループの後にはまだlistは空です。

私の質問は:上記のコードがうまく動作しても、他の人にはややこしいと思われますが、ループが完了した後にはただ1つだけlistを作ることができます。ループからより多くの情報を引き出すことができるようにこれを修正するより良い方法はありますか?他の値を保存するためにlist2が必要な場合はどうすればよいですか?ありがとう。

+0

何をしたいですか? –

答えて

0

シェルスクリプトが動作します。あなたが1のラインinstealあたりの情報の2枚を取得したい場合は、コンマまたは任意の他の「特別な」文字で区切られた所望の値を連結する

echo $(echo ${result} | cut -f3 -d' ' | tr -d [:alpha:] | tr -d [:punct:]) 

この行を変更する必要があります。次に、あなたのリストをこのように解析することができます:

for haha in ${list} 
do 
    printf "current slot is:%s, secondary info:%s \n" $(echo ${haha} | cut -f1 -d',') $(echo ${haha} | cut -f2 -d',') 
done 
0

this explanationを参照してください。パイプが関わっているので、現在のシェルではなく、サブシェル(現在のプロセスの(環境/シェル)変数を更新できない子プロセス)でコードが実行されます(while read...)。

現在のシェルでwhile read...ループを実行するための回避策を選択してください。

関連する問題