shell脚本变量无法作为top命令参数问题求助
问题分析与解决:Android adb shell中top命令-p参数变量传递报错
报错原因
问题根源是脚本文件使用了DOS格式的换行符(CRLF)。在Windows环境下编辑的脚本,每行结尾会带有隐藏的\r(回车符),当在Android的adb shell(基于Unix环境)中执行脚本时,变量$pid会包含这个回车符,实际值是5889\r而非单纯的5889。
top命令解析参数时,会把5889\r当成一个整体,而回车符会让终端光标回到行首,覆盖部分命令内容,所以才会出现'op: bad -p '5889这种奇怪的报错信息。
echo命令看起来输出正常,是因为echo会将\r识别为换行操作,终端显示的是干净的PID数字,但变量内部的回车符依然存在。
解决方法
方法1:转换脚本换行符为Unix格式(LF)
- 若用Notepad++编辑脚本:打开脚本后,点击「编辑」→「文档格式转换」→「转为Unix(LF)」,保存后重新推送到设备。
- 若设备支持
dos2unix工具,可直接在adb shell中执行:dos2unix data/gettop.sh
方法2:在脚本中过滤变量的回车符
修改PID赋值的行,用tr命令去除回车符:
#!/bin/bash pid=$(pidof -s com.example.app | tr -d '\r') echo $pid top -o %CPU,%MEM -p $pid > /data/topresults.txt
或者用sed命令:
pid=$(pidof -s com.example.app | sed 's/\r$//')
内容的提问来源于stack exchange,提问作者mbob98
相关产品推荐
相关产品推荐

