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')