Android手机Shell (2013-03-13 12:22:38)
标签: android shell linux 分类: 安卓手机
linux下的shell是功能非常强大的脚本语言,正像windows上的bat一样,可以简化很多繁重的重复性工作。而Android手机是基于linux系统下的操作系统,幸运的是它继承了linux的shell,因此我们也可以在Android的shell来做很多工作,不过前提是必须得安装busybox,至于命令的话可以在终端模拟器中直接执行,也可以写成以sh为后缀的脚本文件放在手机内存中用re文件管理器打开执行。
 
在Android中的shell第一行必须是#!/system/bin/sh
#在shell中是注释的意思,编译器不会处理。
 
svc wifi enable/disable #表示关闭wifi,开启的话是svc wifi enable/enable。
svc data enable/disable #表示关闭GPRS。
 
reboot命令是重启,用之前需要用su命令获取root权限。
reboot -p 关机
reboot recovery 重启进入recovery模式。
 
变量:
shell中的变量是弱类型的,用之前不用声明,但引用的变量值时候要加$,例如计算a+1要这样写:a=$a+1;
 
read命令:
shell中也可以让用户输入一个数据,在计算。用read来让用户输入数据。如:
read a;echo $a #表示输入一个数给变量a,在输出a的值。
read也可以输入一个数组,例如:
read a
for i in $a
do
    echo $i
done
 
数学计算:
在shell中可以用let命令来进行数学计算,如:let "a=$a+1"就相当于C语言中的a=a+1.
let "var=$var1+var2"表示两个变量相加。
此外也可以用expr来进行计算,expr $[$var1+$var2]表示两个变量相加,效果与上面相同。
 
for:
Android中的shell也可以使用for循环语句,如:
for ((i=1;i<10;i++))
do
#代码#
done
表示从一到十
for name in `ls`
表示获取当前文件夹中的所有文件名,把文件名传递给name变量。注意ls表示获取当前文件夹下的文件名列表,ls本身就是一个命令,所以要加`,`是tab键上方的那个键,加了`表示ls的执行结果。
shell中的for语句非常灵活,还有很多种用法,不再列举。
 
此外,还有while循环,例如计算从一加到十:

while((a<10))
  do
     let "a=$a+1"
     echo $a
 done


 
|通道命令:
|为通道,就是把前面命令的执行结果传递给后面的命令,后面的命令在此结果的执行基础上再执行。
例如:ls | grep music表示查询当前目录下是否有music文件或文件夹,如果有的话显示music,如果没有的话没有显示。
 
mount -o remount /dev/block/mtdblockX /system
它的意思是把手机上的system文件夹挂载为只读,代码中的mtdblockX中的X是一个数,表示system在哪个块。例如我的手机就是mount -o remount /dev/block/mtdblock3 /system。你可以用mount | grep system来查看你的手机system文件夹的挂载情况。而且也能查看system文件夹的挂载位置,即在哪个块。如果后面为ro即是只读,如果为rw即为读写。mount | grep system代码的意思就是用mount是查看手机的个文件夹的挂载情况,然后把结果传递给grep命令,grep命令再在结果中查询出含有system关键字的项,然后显示出来。
要想挂载为读写,可以这样写:
mount -o remount,ro /dev/block/mtdblockX /system
 
字符串处理:

Android的busybox中还有一些强大的字符串处理工具如sed,awk等。如:
 var1=`echo $var | sed /s/apk/odex/`
 echo $var1    #表示把字符串$var中的apk替换为odex,注意:等号后面和末尾要加`.
  
 var1=`echo $var | awk -F . '{print $1,$2}'`
 echo $var1  #作用同上


 
光看教程是没有用的,还得多做一些实际操作,这样才能对各个命令有跟深的了解。
##################################################################################################

#!/system/bin/sh
 #
 cd /sdcard/apk
 for name in `ls` #获取APK文件名
 do
 odex=`echo $name | sed s/.apk/.odex/`  #获取odex文件名
 dexopt-wrapper $name /system/app/$odex  #制作odex文件
 cp /sdcard/apk/$name /system/app/$name  #复制APK文件到系统目录
 chmod 644 /system/app/$name  #修改APK文件权限
 chmod 644 /system/app/$odex  #修改odex文件的权限
 done


这段代码是批量在手机上生成odex文件。odex是从apk中提取出来的可运行文件,从apk中提取出odex文件可以加快启动速度,减少对RAM的占用,因为没有odex的话,系统也要从apk包中提取dex再运行。
用的时候,现在sdcard上建立一个名为APK的文件夹,把要制作odex的.apk文件放在这个文件夹下。当然也可以修改代码,制作适合自己的。
复制把以上代码(由于windows与linux编码不一样,最好在手机上操作),存为一个后缀为.sh的文件中,把该文件放在手机内存上(不能放卡上)。
打开re文件管理器,然后设置为可读写,找到这个文件,点击运行就可以了。也可以用其他软件打开,如终端模拟器,但必须有高级权限。
此教程只适用于G8手机的2.3.7系统,如果没有dexopt-wrapper 文件的自己去论坛上下。
 
##################################################################################################

#!/system/bin/sh
 a=0
 b=0
 c=0
 d=0
 cd /sdcard/DCIM/
 for i in `ls`
 do
  name=`echo $i|awk -F . '{print $2}'`
  mv $i $a$b$c$d"."$name
  let "d=$d+1"
  let "d=$d"
  if [ $d = 0 ];then
   let "c=$c+1"
   let "c=$c"
   if [ $c = 0 ];then
    let "b=$b+1"
    let "b=$b"
    if [ $b = 0 ];then 
     let "a=$a+1"
     let "a=$a"
    fi
   fi
  fi
 done


这段代码是修改某文件夹下的文件名为00000,00001,00002......形式的,便于管理。
用法:把代码复制下来存为sh文件(注意编码格式),然后用re管理器或终端打开即可。可以自己修改代码来决定重命名的文件。