1.概述
Shell 既是一个连接用户和 Linux 内核的程序,又是一门管理 Linux 系统的脚本语言,shell 脚本类似 windows 的批处理文件,shell 脚本就是将连续执行的命令写成一个文件。 shell 脚本提供数组、循环、条件判断等功能
2.文件保存并退出
1、在vi命令下,先按键盘esc键,再按(英文冒号)
2、输入"wq"
3、回车即可保存并退出vi命令,回到主shell界面
3.进入编辑模式
进入到目录下 vi +文件名称
如果是system下的文件需要先remount
mount -o rw,remount /system
然后 busybox vi +文件名称
4.shell脚本基本命令
echo 命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。输出字符串时,可以省略掉引号。
echo命令默认在末尾添加换行符。
printf 命令
printf 命令模仿 C 程序库(library)里的 printf() 程序。标准所定义,因此使用printf的脚本比使用echo移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像
echo 自动添加换行符,我们可以手动添加 \n
test命令
shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
注意脚本中不要出现;特殊字符
#!/system/bin/sh
m=30
echo "打印变量赋值"
echo "m=$m"
echo "第一种for循环方式"
for i in $(seq 1 10)
do echo "i=$i"
done
echo "第二种for循环方式"
for j in `seq 1 10`
do echo "j=$j"
done
echo "-eq相等,-ne不等,-gt大于,-lt小于,-ge大于等于,-le小于等于"
echo "while循环1 ge大于0"
a=5
while [ $a -ge 0 ]
do echo "a=$a"
a=$a-1
done
echo "while循环2 gt小于5"
a=0
while [ $a -lt 5 ]
do echo "a=$a"
a=$a+1
done
for k in `seq 1 10`
do echo "k=$k"
if [ $k -ge 3 ]
then echo "超编停止"
break
else echo "继续"
fi
done
systemmode=$(getprop "ro.product.system.model")
echo "mode:$systemmode"
echo "data:$(date "+%Y%m%d%H%M%S")"
echo "data1:$(date "+%Y-%m-%d %H:%M:%S")"
echo "data2:$(date "+%Y.%m.%d %H:%M:%S")"
echo "你输入的数字为:"
read num
echo "number=$num"
case $num in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
a="abc"
b="efg"
if [ $a != $b ]
then
echo "$a != $b : a 等于 b"
else
echo "$a != $b: a 不等于 b"
fi
number=1
while(( $number<=5 ))
do
echo "number=$number"
let "number++"
done
echo '按下 <Q> 退出'
echo -n '输入你最喜欢的歌名: '
while read SONG
do
if [ $SONG != "3" ]
then
echo "退出"
break
else
echo "啊!$SONG 真是一首好歌"
fi
done
FunReturn(){
echo "两个数字进行相加运算..."
echo "输入第一个数字: "
read num
echo "输入第二个数字: "
read anothernum
echo "两个数字分别为 $num 和 $anothernum !"
return $(($num+$anothernum)) #分别返回数值
}
FunReturn # 调用函数
echo "输入的两个数字之和为 $? !" #使用通配符获取上一条指令的返回值
FunParam(){
echo "输入第一个参数 $1 !"
echo "输入第二个参数 $2 !"
echo "输入第十个个参数 $10 !"
echo "参数总数共 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
FunParam 1 2 3 4 5 6 7 8 9 10
5.vim 相关编辑操作
vim 编辑器有两种操作模式:
普通模式
当你刚打开要编辑的文件时(或新建一个文件时),vim 编辑器会进入普通模式。在普通模式中,vim 编辑器会将按键解释成命令
插入模式
在插入模式下,vim 会将你在当前光标位置输入的每个键都插入到缓冲区。按下i键就可以进入插入模式。要退出插入模式回到普通模式,按下键盘上的退出键(Esc 键,也就是 Escape 键)就可以了。
在普通模式中,可以用方向键在文本区域移动光标(只要 vim 能正确识别你的终端类型)。如果你恰巧在一个古怪的没有定义方向键的终端连接上,也不是完全没有希望。vim 中有用来移动光标的命令。
h:左移一个字符
j:下移一行(文本中的下一行)
k:上移一行(文本中的上一行)
l:右移一个字符
在大的文本文件中一行一行地来回移动会特别麻烦,幸而 vim 提供了一些能够提高移动速度的命令。
PageDown(或Ctrl+F):下翻一屏
PageUp(或Ctrl+B):上翻一屏
G:移到缓冲区的最后一行
num G:移动到缓冲区中的第num行
gg:移到缓冲区的第一行
vim 编辑器在普通模式下有个特殊的功能模式叫命令行模式。命令行模式提供了一个交互式命令行,可以输入额外的命令来控制vim 的行为。要进入命令行模式,在普通模式下按下冒号键
光标会移动到消息行,然后出现冒号,等待输入命令。
在命令行模式下有几个命令可以将缓冲区的数据保存到文件中并退出 vim。
q:如果未修改缓冲区数据,退出
q!:取消所有对缓冲区数据的修改并退出
w filename:将文件保存到另一个文件中
wq:将缓冲区数据保存到文件中并退出
6.执行shell脚本传参的案例
vim test01.sh
#!/bin/bash
for i in a b c d e f g h i j k; do
sh /tmp/li_tmp/shell/test02.sh $i
done
sh 执行脚本 带参数
vim test02.sh
#!/bin/bash
sql="select * from $1;"
echo "$sql"
sh test01.sh
select * from a;
select * from b;
select * from c;
select * from d;
select * from e;
select * from f;
select * from g;
select * from h;
select * from i;
select * from j;
select * from k;
7.脚本编辑条件判断
字符串判断
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
循环:
形式一:
while …; do
…
done
形式二:
for var in …; do
…
done
for i in {1…6};
do
echo $i
done
1
2
3
4
8.Shell脚本编程需要注意事项
1.shell脚本名称命名一般为英文的大写,小写;不能用特殊符号,空格来命名;一般以脚本功能命名。
2.shell脚本后缀以.sh结尾
3.shell脚本内容首行需以#!/bin/bash开头
4.shell脚本中变量名称尽量使用大写字母,字母间不能使用“-“,可以使用”_“; 不能以数字,特殊符号开头
结构:声明-注释-代码
功能:接收参数;处理参数
示例:使用vim编写一个shell脚本
[root@007 桌面]# echo $SHELL <==查看SHELL变量,发现当前系统默认使用Bash作为命令解释器
/bin/bash
[root@007 桌面]# vim fist_shell.sh <==使用vim编写脚本
[root@007 桌面]# cat fist_shell.sh
#!/bin/bash <==脚本声明,定义该脚本所使用的shell类型
#This is my Fisrt shell <==#表示注释,没实际意义,shell不会去解析它
#By author Nick.net 2019 <==脚本创建人
echo "Hello World!!!" <==shell脚本主命令执行该脚本呈现的内容
[root@007 桌面]# bash fist_shell.sh <==bash直接执行脚本
Hello World!!!
[root@007 桌面]# ./fist_shell.sh <==输入路径执行脚本
bash: ./fist_shell.sh: 权限不够
[root@007 桌面]# chmod o+x fist_shell.sh <==赋予脚本可执行权限
[root@007 桌面]# ./fist_shell.sh
Hello World!!!
[root@007 ]# /bin/sh fist_shell.sh <==通过/bin/sh直接执行,不需要执行权限
Hello World!!!