0

私はシェルスクリプトを初めて使用し、配列内のすべての Android デバイスを取得しようとしていますが、関数が終了すると配列が空になります。

#!/bin/bash

declare -a arr
let i=0

MyMethod(){
  adb devices | while read line #get devices list
  do
    if [ ! "$line" == "" ] && [ `echo $line | awk '{print $2}'` == "device" ]
    then
      device=`echo $line | awk '{print $1}'`
      echo "Add $device"
      arr[$i]="$device"
      let i=$i+1
    fi
  done

echo "In MyMethod: ${arr[*]}"
}

################# The main loop of the function call #################

MyMethod
echo "Not in themethod: ${arr[*]}"

arr- は空です。何が間違っていますか?

アドバイスをありがとう。

4

1 に答える 1

1

考えられる問題は、コマンドをパイプ処理するとサブシェルで実行され、そこで変更された変数が親シェルに伝播されないことです。あなたの解決策はおそらく次のようなものになるでしょう:

adb devices > devices.txt
while read line; do
    [...]
done < devices.txt

ここで、出力を中間ファイルに保存してwhileループにロードするか、bashの構文を使用してコマンド出力を中間一時ファイルに保存します。

while read line; do
    [...]
done < <(adb devices)

したがって、スクリプトは次のようになります。

#!/bin/bash

declare -a arr
let i=0

MyMethod(){
  while read line #get devices list
  do
    if [ -n "$line" ] && [ "`echo $line | awk '{print $2}'`" == "device" ]
    then
      device="`echo $line | awk '{print $1}'`"
      echo "Add $device"
      arr[i]="$device" # $ is optional
      let i=$i+1
    fi
  done < <(adb devices)

echo "In MyMethod: ${arr[*]}"
}

################# The main loop of the function call #################

MyMethod
echo "Not in themethod: ${arr[*]}"

いくつかの追加の観察:

  1. エラーを回避するために、後ろの引用符を二重引用符で囲むことをお勧めします。
  2. ドルはオプションですarr[$i]=
  3. 空の文字列には特定のテストがあります。[ -z "$str" ]文字列が空(長さがゼロ)かどうかを[ -n "$str"]チェックし、空でないかどうかをチェックします。

これがお役に立てば幸いです=)

于 2012-10-15T23:14:58.043 に答える