Shell - 将Android设备转换为数组

时间:2012-10-15 22:01:23

标签: android bash shell sh

我是shell脚本的新手,我试图将所有的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 - 是空的,我做错了什么?

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

您可能遇到的问题是管道命令导致它在子shell中运行,并且在那里更改的变量不会传播到父shell。你的解决方案可能就像:

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. 中的美元是可选的
  4. 对空字符串进行了特定测试:[ -z "$str" ]检查字符串是否为空(零长度),[ -n "$str"]检查字符串是否为
  5. 希望这有助于=)