android开发笔记之sh脚本
2016-05-15 11:02
435 查看
sh脚本开头
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
执行sh脚本
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行:
Sh代码
chmod +x filename
或者
sudo chmod 777 filename
然后,您可以通过输入下面二个命令的一个来执行您的脚本。
./filename
或者
source filename
输出信息:
echo "hello sh"
退出当前shell
exit 1 exit 0
注释,
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。#print debug info
多行注释
: << ! 语句1 语句2 语句3 语句4 !
变量
在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:变量名=值
取出变量值可以加一个美元符号($)在变量前面
#test variable var_1=12 echo "var_1=${var_1}"
#test variable var_2=abc_21 echo "var_2=${var_2}"
条件判断—if
if 语句格式:
if条件; then Command fi
if 条件; then command else command fi
if 条件; then
command
elif 条件; then command else command fi
条件判断:
字符串判断
str1 = str2 当两个串有相同内容、长度时为真str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空)
-z str1 当串的长度为0时为真(空串)
str1 当串str1为非空时为真
\ > \ < 比较大小的时候 可以使用大于号,小于号,但是需转义。例如 [ “2006.01.23” > “2005.03.01” ] && echo dayu || echo budayu
数字的判断
int1 -eq int2 两数相等为真int1 -ne int2 两数不等为真
int1 -gt int2 int1大于int2为真
int1 -ge int2 int1大于等于int2为真
int1 -lt int2 int1小于int2为真
int1 -le int2 int1小于等于int2为真
文件的判断
-r file 用户可读为真-w file 用户可写为真
-x file 用户可执行为真
-f file 文件为正规文件为真
-d file 文件为目录为真
-c file 文件为字符特殊文件为真
-b file 文件为块特殊文件为真
-s file 文件大小非0时为真
-t file 当文件描述符(默认为1)指定的设备为终端时为真
复杂逻辑判断
-a 与-o 或
! 非
上面的三种写在括号内,对应的 && || 写在中括号之间。
例如,
if [ "$a" eq 1 -o "$b" eq 2 ] && [ "$c" eq 3 ]
字符串匹配
if [ `echo $str | grep -e regexp` ];then .
数字的样例:
#!/bin/sh var_1=$1 var_2=$2 echo "var_1=${var_1}" echo "var_2=${var_2}" if [ ${var_2} -eq ${var_1} ] ; then echo "var_2:{$var_2} == var_1:{$var_1}" elif [ ${var_2} -gt ${var_1} ] ; then echo "var_2:{$var_2} > var_1:{$var_1}" else echo "var_2:{$var_2} < var_1:{$var_1}" fi
./test.sh 10 10
var_1=10 var_2=10 var_2:{10} == var_1:{10}
字符串的样例:
#!/bin/sh var_1=$1 var_2=$2 echo "var_1=${var_1}" echo "var_2=${var_2}" if [ ${var_2} = ${var_1} ] ; then echo "var_2:{$var_2} == var_1:{$var_1}" fi
./test.sh a a
var_1=a var_2=a var_2:{a} == var_1:{a}
case语句:
第一种:case分支语句的格式如下:
case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认执行的命令序列 ;; esac
例如:
case $(uname -s) in Darwin) ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64 ;; Linux) ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64 ;; *) ANDROID_EMULATOR_PREBUILTS= ;; esac
Demo:
#!/bin/sh var_1=$1 echo "var_1=${var_1}" case $var_1 in user) echo "var_1 is user" ;; eng) echo "var_1 is eng" ;; userdebug) echo "var_1 is userdebug" ;; *) echo "var_1 is not one of (user,eng,userdebug)" ;; esac
./test.sh user
var_1=user var_1 is user
第二种:
case分支语句的格式如下:
case $变量名 in 模式1 |模式2|模式3) 命令序列 ;; *) 默认执行的命令序列 ;; esac
样例:
#!/bin/sh var_1=$1 echo "var_1=${var_1}" case $var_1 in "user" | "userdebug" | "eng") echo "var_1 is $var_1" ;; *) echo "var_1 is not one of (user,eng,userdebug)" ;; esac
./test.sh user
var_1=user var_1 is user
循环:
形式一:while ...; do ... done
形式二:
for var in ....; do .... done
for i in {1..6}; do echo $i done
./test.sh
1 2 3 4 5 6
for File in 1 2 3 4 5 ; do echo $File done
./test.sh
1 2 3 4 5
for shname in `ls *.sh`; do name=`echo "$shname" | awk -F. '{print $1}'` echo $name done
./test.sh
test_01 test
for((i=1;i<50;i++)); do if(((i%3)==0)); then echo $i fi done
./test.sh
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48
min=1 max=20 while [ $min -le $max ]; do echo $min min=`expr $min + 1` done
./test.sh
1 2 3 4 5 6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
函数
function name() { # inside the body $1 is the first argument given to the function # $2 the second ... body }
#!/bin/sh function usage() { echo "usage()------------start" echo "-----------------------" echo "usage()-------------end" } usage
./test.sh
usage()------------start ----------------------- usage()-------------end
expr
四则计算:
a1=10 a2=20 a3=`expr $a1 + $a2` echo "=========================" echo "a3=$a3" echo "=========================" a4=`expr 10 + 12` echo "a4=$a4" echo "========================="
./test.sh
========================= a3=30 ========================= a4=22 =========================
计算字符串的长度:
string="hello,everyone my name is xiaoming" leng_01=`echo ${#string}` echo "leng_01=$leng_01" leng_02=`expr length "$string"` echo "leng_02=$leng_02"
./test.sh
leng_01=34 leng_02=34
expr中的expr index stringsubstring索引命令功能在字符串string上找出substring中字符第一次出现的位置,若找不到则expr index返回0或1
string="hello,everyone my name is xiaoming" index_start=`expr index "$string" hello` echo "index_start=$index_start"
./test.sh
index_start=1
expr中的expr match $string substring命令在string字符串中匹配substring字符串,然后返回匹配到的substring字符串的长度,若找不到则返回0
string="hello,everyone my name is xiaoming" match_length=`expr match "$string" everyone` echo "match_length=$match_length" match_length=`expr match "$string" hell.* ` echo "match_length=$match_length" match_length=`expr match "$string" hell` echo "match_length=$match_length"
./test.sh
match_length=0 match_length=34 match_length=4
在shell中可以用{string:position}和{string:position:length}进行对string字符串中字符的抽取。第一种是从position位置开始抽取直到字符串结束,第二种是从position位置开始抽取长度为length的子串。而用expr中的expr substr stringposition $length同样能实现上述功能
string="hello,everyone my name is xiaoming" echo ${string:10} echo ${string:10:6} echo ${string:10:10} substring=`expr substr "$string" 11 6` echo "substring:$substring"
./test.sh
yone my name is xiaoming yone m yone my na substring:yone m
Unix 命令:
虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。常用命令语法及功能
echo “some text” 将文字内容打印在屏幕上
ls 文件列表
mv oldname newname 重命名文件或移动文件
cp sourcefile destfile 文件拷贝
rm file 删除文件
cat file.txt 输出文件内容到标准输出设备(屏幕)上
wc file.txt 计算文件行数 计算文件中的单词数 计算文件中的字符数
grep pattern file 在文件内搜索字符串比如:grep searchstring file.txt
file somefile 得到文件类型
read var 提示用户输入,并将输入赋值给变量
sort file.txt 对file.txt文件中的行进行排序
head file 打印文本文件开头几行
tail file 打印文本文件末尾几行
tee 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
basename file 返回不包含路径的文件名
dirname file 返回文件所在路径
uniq 删除文本文件中出现的行列比如: sort file.txt | uniq
find 搜索文件比如:根据文件名搜索find . -name filename -print
#!/bin/sh SRC_DIR=$PWD file=$SRC_DIR/test.sh #echo "some text" #echo "----------------" #ls #echo "----------------" #wc $SRC_DIR #wc $file #echo "----------------" #grep -ni fi $file #echo "----------------" #file $file #echo "----------------" #sort $file #echo "----------------" #echo -e "Please enter your name:" #read name #echo "your name:$name" #echo "----------------" #cat $file #echo "----------------" #head $file #echo "----------------" #tail $file #echo "----------------" #cat $file | tee 123.txt #echo "----------------" #basename $file #echo "----------------" #dirname $file #echo "----------------" #cat test.sh | sort |uniq #echo "----------------" #find . -name "*.sh" -print exit 1
管道 (|)
将一个命令的输出作为另外一个命令的输入。grep "hello" file.txt | wc -l
在file.txt中搜索包含有”hello”的行并计算其行数。
重定向
将命令的结果输出到文件,而不是标准输出(屏幕)。写入文件并覆盖旧文件
加到文件的尾部,保留旧文件内容。
export
设置或显示环境变量, export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登录操作export PATH=”$PATH:/home/user/bin” 增加
export -p 显示shell赋予程序的环境变量
mbldenv.sh
#!/bin/bash # ########################################################## # ALPS(Android4.1 based) build environment profile setting # ########################################################## # Overwrite JAVA_HOME environment variable setting if already exists JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 export JAVA_HOME # Overwrite ANDROID_JAVA_HOME environment variable setting if already exists ANDROID_JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 export ANDROID_JAVA_HOME # Overwrite PATH environment setting for JDK & arm-eabi if already exists PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH export PATH
常用的一些sh命令:
当前目录的绝对路径:
#!/bin/sh my_source_dir=$(pwd) echo "my_source_dir:${my_source_dir}" my_source_dir_02=$PWD echo "my_source_dir_02:$my_source_dir_02"
./test.sh
my_source_dir:/home/android/test_sh my_source_dir_02:/home/android/test_sh
系统属性相关的写读操作:
setprop qcom.audio.init complete target=`getprop ro.board.platform`
日期
RELEASE=`date +%Y%m%d` echo $RELEASE
输出日期:
20160510
RELEASE=`date +%Y%m%d%H%M%S` echo $RELEASE
输出日期:
20161103160827
删除文件夹,创建文件夹
rm -rf $BUILD_OUT mkdir -p $BUILD_OUT
进入目录
cd /sys/devices/*wcnss-wlan
执行sh脚本时,输入参数的个数:
$# //执行脚本的名字 echo $0 //执行sh脚本时,输入的第一个参数: echo $1 //执行sh脚本时,输入的第二个参数: echo $2
echo $# echo $0 echo $1 echo $2
./test_01.sh 1 2
2 ./test_01.sh 1 2
参考资料:
http://blog.csdn.net/crazyhacking/article/details/10182563linux shell 之if——-用if做判断
http://www.cnblogs.com/kangyoung/p/3556186.html
Linux shell for while 循环
http://blog.csdn.net/junjieguo/article/details/7293622
bash shell中expr命令下几种的使用
http://blog.csdn.net/a2005120832/article/details/5656187
linux的sh脚本编程
http://blog.csdn.net/xifeijian/article/details/9209643
Linux Shell脚本编程--wc命令
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories