我使用ADB获取Android设备屏幕的密度,然后想要将其映射到mdpi,hdpi,xhdpi等。我能够将密度保存到使用read和awk的变量,但是我无法对它进行任何比较。作为一个Bash newb,我不确定变量类型的结果,并试图找出,例如,如果它不到300我可以,到目前为止没有正面结果。
function device(){
adb -s <device ID> shell getprop ro.sf.lcd_density | while read line
do
PPI=`echo $line | awk '{print $1}'`
echo "$PPI"
done
}
device
PPI=$(device)
echo $PPI
#this is where the problem starts, I can not find any way to do a comparison of $PPI.
if (("$PPI" = "560"));
then
echo "rock star"
fi
答案 0 :(得分:1)
您可以使用case语句来获取密度。这对我有用:
ppi=$(adb wait-for-device shell getprop ro.sf.lcd_density | tr -d '\r')
density="N/A"
case $ppi in
120)
density="ldpi" ;;
160)
density="mdpi" ;;
240)
density="hdpi" ;;
480)
density="xhdpi" ;;
320)
density="xxhdpi" ;;
640)
density="xxxhdpi" ;;
esac
echo $density
使用-le
(小于或等于)更新代码:
get_ppi() {
adb wait-for-device shell getprop ro.sf.lcd_density | tr -d '\r'
}
get_density() {
_ppi=$1
if [ $_ppi -le 120 ]; then
echo "ldpi"
elif [ $_ppi -le 160 ]; then
echo "mdpi"
elif [ $_ppi -le 240 ]; then
echo "hdpi"
elif [ $_ppi -le 480 ]; then
echo "xhdpi"
elif [ $_ppi -le 320 ]; then
echo "xxhdpi"
elif [ $_ppi -le 640 ]; then
echo "xxxhdpi"
else
echo "N/A"
fi
}
ppi=$(get_ppi)
density=$(get_density $ppi)
echo $ppi
echo $density
我的设备输出:
480
xhdpi
答案 1 :(得分:1)
您的代码不起作用的原因是即使在OSX和Linux中,adb
也使用\r\n
作为行分隔符。因此,$PPI
值不是560
,而是560\r
。在进行任何比较之前,您需要删除额外的\r
:
ADBShell () { adb ${2+-s} $2 shell "$1" | tr -d '\r'
}
DPI () { ADBShell "getprop ro.sf.lcd_density" $1
}
Density () {
local DPI=$(DPI $1)
case 1 in
$(($DPI <= 120))) echo "ldpi" ;;
$(($DPI <= 160))) echo "mdpi" ;;
$(($DPI <= 240))) echo "hdpi" ;;
$(($DPI <= 320))) echo "xhdpi" ;;
$(($DPI <= 480))) echo "xxhdpi" ;;
$(($DPI <= 640))) echo "xxxhdpi" ;;
esac
}
echo "$(Density $DEVICE_ID) ($(DPI $DEVICE_ID)dpi)"