![将参数传递给命令时转义字符](https://linux22.com/image/25379/%E5%B0%86%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E7%BB%99%E5%91%BD%E4%BB%A4%E6%97%B6%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6.png)
我经常使用 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