将参数传递给命令时转义字符

将参数传递给命令时转义字符

我经常使用 Android 手机将音频文件录制为 WAV 文件到手机的内部存储中。我想编写一个 Bash 脚本来从手机中提取最近录制的文件并将其移至桌面。这是我到目前为止所得到的:

adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while read file ; do
    adb pull "$file" ~/Desktop/
done

然而,这失败了。 ADB 似乎没有正确转义,并且在尝试运行脚本时收到以下消息:

' does not existstorage/sdcard0/Sound Recordings/20120817T065953.wav

它似乎忽略了双引号,当它尝试运行时,一切基本上都会中断,因为它可能会看到 3 个参数而不是两个,如下所示:

adb pull /storage/sdcard0/Sound Recordings/20120817T065953.wav ~/Desktop/

如何调整脚本以$file在必要时将反斜杠插入到变量中?在这种情况下这是正确的解决方案吗?

答案1

由于您在另一个 shell 级别中运行它,因此它会扩展它在子外壳中运行。解决此问题的最简单方法是转义文件名中的所有特殊字符:

adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while IFS= read -r file ; do
    adb pull "$(printf %q "$file")" ~/Desktop/
done

答案2

这是解决方案:

adb pull "/storage/sdcard0/Sound Recordings/$(
    adb shell ls -1t '/storage/sdcard0/Sound Recordings' |
        sed q |
        tr -d '\r'
)" .

您遇到问题,因为adb像 Windows 一样返回一些回车符\r

sed q只是显示第一次出现的有趣方式,例如head -n1

相关内容