我是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
- 是空的,我做错了什么?
感谢您的建议。
答案 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[*]}"
一些额外的观察:
arr[$i]=
[ -z "$str" ]
检查字符串是否为空(零长度),[ -n "$str"]
检查字符串是否为希望这有助于=)