1.Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了
#!/bin/sh(#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序)
2.shell脚本的扩展名为.sh,回显也用echo
echo 后面的字符串可加引号或不加
显示转义字符
echo ""It is a test""
结果将是:
"It is a test"
显示变量
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
#!/bin/sh
read name
echo "$name It is a test"
4.显示换行
echo -e "OK!
" # -e 开启转义
echo "It it a test"
输出结果:
OK!
It it a test
显示不换行
#!/bin/sh
echo -e "OK! c" # -e 开启转义 c 不换行
echo "It is a test"
输出结果:
OK! It is a test
显示结果定向至文件
echo "It is a test" > myfile
原样输出字符串,不进行转义或取变量(用单引号)
echo '$name"'
输出结果:
$name"
显示命令执行结果
echo `date`
结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014
3.运行shell脚本的方法
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
./告诉系统说就在当前目录找
还可以直接运行解释器,其参数就是shell脚本的文件名
/bin/sh test.sh
4.变量
定义变量的方法和批处理命令差不多(批处理有set,没有双引号)
your_name="runoob.com"
5.for 语句
for file in `ls /etc`
以上语句将 /etc 下目录的文件名循环出来。
for循环一般格式为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
6.使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。如:
your_name="qinjx"
echo $your_name
echo ${your_name}
备注:批处理中引用变量是%变量%
7.字符串
字符串可以用单引号,也可以用双引号,也可以不用引号
单引号
str='this is a string'
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号
your_name='qinjx'
str="Hello, I know your are "$your_name"!
"
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
获取字符串长度
string="hello"
echo ${#string}
提取子字符串
string="hello"
echo ${string:1:2}
打印st
8.Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
定义数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组
读取数组元素值的一般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
9.Shell 注释
以"#"开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号
10.Shell test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
参数说明-eq等于则为真-ne不等于则为真-gt大于则为真-ge大于等于则为真-lt小于则为真-le小于等于则为真
数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
实例演示:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo 'The two numbers are equal!'
else
echo 'The two numbers are not equal!'
fi
输出结果:
The two numbers are equal!
字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串长度伪则为真
-n 字符串 字符串长度不伪则为真
实例演示:
num1=100
num2=100
if test num1=num2
then
echo 'The two strings are equal!'
else
echo 'The two strings are not equal!'
fi
输出结果:
The two strings are equal!
文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
实例演示:
cd /bin
if test -e ./bash
then
echo 'The file already exists!'
else
echo 'The file does not exists!'
fi
输出结果:
The file already exists!
另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
cd /bin
if test -e ./notFile -o ./bash
then
echo 'One file exists at least!'
else
echo 'Both dose not exists!'
fi
输出结果:
One file exists at least!
11.Shell 流程控制
if else
如果else分支没有语句执行,就不要写这个else,就像这样
if condition
then
command1
command2
...
commandN
fi
如果else分支有语句:
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else
if else-if else 语法格式:
if condition1
then
command1
elif condition2
command2
else
commandN
fi
while 语句
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while condition
do
command
done
以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。
#!/bin/sh
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
运行脚本,输出:
1
2
3
4
5
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
echo "是的!$FILM 是一部好电影"
done
运行脚本,输出类似下面:
按下 <CTRL-D> 退出
输入你最喜欢的电影名: w3cschool菜鸟教程
是的!w3cschool菜鸟教程 是一部好电影
case
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
下面的脚本提示输入1到4,与每一种模式进行匹配:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
输入不同的内容,会有不同的结果,例如:
输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3
12.shell函数
shell中函数的定义格式如下:
函数名(){
函数体
}
下面的例子定义了一个函数并进行调用:
#!/bin/bash
demoFun(){
echo "This is your first shell function!"
}
echo "Function begin..."
demoFun
echo "Function end!
输出结果:
Function begin...
This is your first shell function!
Function end!
下面定义一个带有return语句的函数:
#!/bin/bash
funWithReturn(){
echo "The function is to get the sum of two numbers..."
echo -n "Input first number: "
read aNum
echo -n "Input another number: "
read anotherNum
echo "The two numbers are $aNum and $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "The sum of two numbers is $? !"
输出类似下面:
The function is to get the sum of two numbers...
Input first number: 25
Input another number: 50
The two numbers are 25 and 50 !
The sum of two numbers is 75 !
函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可
13.linux命令
linux文件属性
[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]。
从左至右用0-9这些数字来表示。
第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。
当为[ d ]则是目录 当为[ - ]则是文件; 若是[ l ]则表示为链接文档(link file); 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置); 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
改变文件属性chmod
chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
例如:
[root@www ~]# ls -al .bashrc -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc [root@www ~]# chmod 777 .bashrc [root@www ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
14.linux文件与目录管理
我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。
绝对路径:
路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。
相对路径:
路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法啦!
ls: 列出目录 cd:切换目录 pwd:显示目前的目录 mkdir:创建一个新的目录 rmdir:删除一个空的目录 cp: 复制文件或目录 rm: 移除文件或目录
你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp
cd ..进入上层目录
cd / 进入根目录
adb remout 快速的将system挂载为一个可读可写的分区
adb -e shell 进入模拟器
递归创建目录 mkdir -p 2/3/4
移动文件 mv 1.txt 1 把1.txt文件移动到1目录下
复制文件 dd,如下把2.txt文件的内容复制到目录2下面为22.txt文件中
cmp 比较文件内容,如下
相同
不相同
cd (切换目录)
cd是Change Directory的缩写,这是用来变换工作目录的命令。
语法: cd [相对路径或绝对路径] #使用 mkdir 命令创建w3cschool.cc目录 [root@www ~]# mkdir w3cschool.cc #使用绝对路径切换到w3cschool.cc目录 [root@www ~]# cd /root/w3cschool.cc/ #使用相对路径切换到w3cschool.cc目录 [root@www ~]# cd ./w3cschool.cc/ # 表示回到自己的家目录,亦即是 /root 这个目录 [root@www w3cschool.cc]# cd ~ # 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思; [root@www ~]# cd ..
Linux 文件内容查看
Linux系统中使用以下命令来查看文件的内容: cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 less 与 more 类似,但是比 more 更好的是,他可以往前翻页! head 只看头几行 tail 只看尾巴几行
你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。