ADB - 使用 adb shell 从设备获取字符串有意外和奇怪的行为
ADB - Getting string from the device using adb shell has unexpected and weird behavior
当我尝试在 shell 脚本中连接 2 个字符串时,我遇到了最奇怪的问题。
首先,让我告诉你我想做什么。
我想使用 adb
在 Android 设备的外部存储中创建一个文件夹。为此,我首先需要获取设备的外部存储文件夹。
为此,我使用了这个:
folder=$(adb shell 'echo $EXTERNAL_STORAGE')
它有效,因为如果我尝试 运行 echo $folder
结果是 /sdcard
,这是正确的外部存储文件夹。
但我想在其中创建一个新文件夹,名为 testResults。所以,为了获得完整路径,我尝试了这个:
newDir=$folder/testResults
问题是 newDir
变量总是具有值 /testResults
,而忽略了 folder
的值。
一开始我以为可能是subshell的问题,即当我尝试用新的String"for some reason"拼接的时候folder
的值不可用.但后来,它变得更奇怪了......
如果我尝试用比 folder
更小的字符串(例如 'pop')连接 folder
,像这样:
newDir=$folder/pop
这是我运行echo $newDir
:
时的结果
/popard
结论: 由于某种原因,folder
的值是 "ignored",当它试图与其他字符串连接时 s
它实际上将替换 folder
的前 N
个字符(使用 N=length(s)
)。
我想也许 folder
开头的 /s
是造成如此混乱的原因,所以我尝试了这个:
folder=$(adb shell 'echo sdcard')
newDir=$folder/pop
echo $newDir
结果是这样的:
/poprd
结论: adb shell 工具中的某些东西使字符串行为异常。
事实上,问题似乎与 adb 有关,因为如果我尝试这样做:
folder=$(echo "/sdcard") #or even folder="/sdcard"
newDir=$folder/testResults
echo $newDir
结果正确:/sdcard/testResults
但这变得更奇怪了……
我尝试使用文件来帮助我,就像这样:
adb shell 'echo $EXTERNAL_STORAGE' > result.txt
folder=$(cat result.txt)
newDir=$folder/pop
echo $newDir
这里的结果又是/popard
!
如果我打开文件,并在包含字符串 /sdcard
的行中插入一些内容,使其成为(例如)/sdcardish
,然后执行此操作:
folder=$(cat result.txt)
newDir=$folder/pop
echo $newDir
结果是:/popardish
如果我删除文件中的那一行然后添加另一行,它工作正常。
我真的不知道发生了什么......
有人知道可能会发生什么吗?
提前致谢!
我猜 folder
值的末尾有一个换行符。试试这个:
folder=$(adb shell 'echo -n $EXTERNAL_STORAGE')
当我尝试在 shell 脚本中连接 2 个字符串时,我遇到了最奇怪的问题。
首先,让我告诉你我想做什么。
我想使用 adb
在 Android 设备的外部存储中创建一个文件夹。为此,我首先需要获取设备的外部存储文件夹。
为此,我使用了这个:
folder=$(adb shell 'echo $EXTERNAL_STORAGE')
它有效,因为如果我尝试 运行 echo $folder
结果是 /sdcard
,这是正确的外部存储文件夹。
但我想在其中创建一个新文件夹,名为 testResults。所以,为了获得完整路径,我尝试了这个:
newDir=$folder/testResults
问题是 newDir
变量总是具有值 /testResults
,而忽略了 folder
的值。
一开始我以为可能是subshell的问题,即当我尝试用新的String"for some reason"拼接的时候folder
的值不可用.但后来,它变得更奇怪了......
如果我尝试用比 folder
更小的字符串(例如 'pop')连接 folder
,像这样:
newDir=$folder/pop
这是我运行echo $newDir
:
/popard
结论: 由于某种原因,folder
的值是 "ignored",当它试图与其他字符串连接时 s
它实际上将替换 folder
的前 N
个字符(使用 N=length(s)
)。
我想也许 folder
开头的 /s
是造成如此混乱的原因,所以我尝试了这个:
folder=$(adb shell 'echo sdcard')
newDir=$folder/pop
echo $newDir
结果是这样的:
/poprd
结论: adb shell 工具中的某些东西使字符串行为异常。
事实上,问题似乎与 adb 有关,因为如果我尝试这样做:
folder=$(echo "/sdcard") #or even folder="/sdcard"
newDir=$folder/testResults
echo $newDir
结果正确:/sdcard/testResults
但这变得更奇怪了…… 我尝试使用文件来帮助我,就像这样:
adb shell 'echo $EXTERNAL_STORAGE' > result.txt
folder=$(cat result.txt)
newDir=$folder/pop
echo $newDir
这里的结果又是/popard
!
如果我打开文件,并在包含字符串 /sdcard
的行中插入一些内容,使其成为(例如)/sdcardish
,然后执行此操作:
folder=$(cat result.txt)
newDir=$folder/pop
echo $newDir
结果是:/popardish 如果我删除文件中的那一行然后添加另一行,它工作正常。
我真的不知道发生了什么...... 有人知道可能会发生什么吗?
提前致谢!
我猜 folder
值的末尾有一个换行符。试试这个:
folder=$(adb shell 'echo -n $EXTERNAL_STORAGE')