android开发笔记之sh脚本

android开发笔记之sh脚本_第1张图片

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 string position $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/10182563
linux 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命令

你可能感兴趣的:(android,脚本,sh)