全部博文(30)
分类:
2010-07-26 11:15:50
1. Shell是用户与系统内核之间的接口。内核在系统引导时加载入内存,当用户登陆后,系统启动shell,将shell加载入内存,然后等待用户输入命令。Shell解释并执行命令,实现用户与内核的交互。
2. 编写命令可以在命令提示符后直接输入,也可以将命令放入一个文件内,这叫做shell脚本。Shell脚本可以包含判断,循环等编程结构。
3. UNIX shell分为3类:Bourne shell、Korn shell、C shell。
4. Linux 使用的是Bash shell,它是一个扩展的Bourne shell。
5. Shell是一个进程,系统启动shell时会分配给shell一个PID,当输入一个命令时,shell会启动一个子进程,来解释这条命令,如果命令是一个内置命令,则直接调用内核来执行它,如果是一个可执行程序,那么再启动一个子进程,找到这个可执行程序,加载进内存,父进程处于休眠状态。等可执行程序执行完毕了,再唤醒父进程。
6. 重定向-重定向是将输入或输出重定向到文件,而标准是输入和输出终端。符号是< 和 >,两个连起来是追加<< 和 >>。
7. 管道- 管道是将一个命令的输出作为另一个命令的输入。符号是 | 。
8. 创建Bash shell脚本
1. 以 #!/bin/bash 作为行的开始
2. 注释以 # 开始,直到行末
3. Shell脚本文件的权限必须可执行。Chmod +x filename
4. 定义一个变量通过直接赋值或者declare关键字
Name = “jone”
Declare name = “jone”
5. 定义一个全局变量
Export name=”jone”
6. 输出变量
Echo $name
7. 读取用户输入
Read name #将用户的输入的一行赋给变量name
Read first last #将用户的输入的一行,第一个单词赋给变量first,剩下的赋给变量last
Read #将用户输入的一行赋给内置变量REPLY
Read –a arrname #将用户输入的一行赋给一个数组变量
Read –r line #允许用户输入反斜杠
8. 算术运算
decalre –i num #定义一个整型变量
num = 5 #为一个变量赋值
num = 5+5 #执行加法运算
num = 5 + 5 #错误,加法运算符两边有空白字符
num = “5 + 5” #正确,如果有空白字符,可以放在双引号中
num = 4*6 #执行乘法运算
num = 6.5 #错误,整型变量不能赋浮点值
num = 017 #八进制数据
num = 2#101 #二进制数据
num = 16#b #十六进制数据
9. Let 命令
Let i = 5 #定义一个整型变量
Let i=i+5 #执行加法运算
Let i+=5 #令一种写法
((i+=4)) #let 的另一种写法
10. 位置参量
可以在调用shell文件的时候,向shell脚本传入参数。在shell脚本里可以调用这些参数变量。
$0 shell文件名
$1 第一个参数
$9 第九个参数
${10} 第十个参数
$# 参数个数
$* 所有参数
$@ 与$*相同
“$*” 单个变量,所有参数整合成一个字符串
“$@” 多个单独变量
SET 可以重置位置参数,位置参数一旦被重置,原来的参数列表就丢失了。
11. 条件结构和流程控制
1) 退出状态
每一个命令执行完毕后,shell都会返回一个退出状态,表示这条命令是否执行成功,执行成功返回0,执行失败返回1~255,$? 可以返回退出状态的值。例如:
name = ‘tom’
grep “$name” /etc/password #如果在password文件中找到tom,返回0
echo $? #返回0,因为password文件中有tom的用户
2) 内置命令test和let
Test命令可以对表达式和文件进行测试,如果测试为真,则返回退出状态0,如果测试为假,则返回退出状态1。如:
name = “tom” #给变量name赋值
Test $name == “tom” #测试变量name是否等于”tom”,返回退出状态0
Test $name != “tom” #测试变量name是否不等于”tom”,返回退出状态1
Test命令还可以采用另外一种写法单方括号[],单方括号写法中的shell元字符不会被解释,元字符像*,?等。上面的例子也可以写成:
name = “tom” #给变量name赋值
[ $name == “tom” ] #测试变量name是否等于”tom”,返回退出状态0
[ $name != “tom” ] #测试变量name是否不等于”tom”,返回退出状态1
[ $name == [Tt]?? ] #由于元字符不会被解释,所以?就是?,返回退出状态1
X=5 #给变量x赋值
Y=20 #给变量y赋值
[ $x –le $y ] # -le 是test命令操作符,意思是小于等于,返回0
Test命令操作符还有以下:
[string1 == string2] string1等于string2
[string != string] string1不等于string2
[ string ] string不为空
[ -z string ] string的长度为0
[ -n string ] string的长度不为0
[string1 –a string2] string1和string2都为真
[string1 –o string2] string1和string2有一个为真
[int1 –eq int2] int1和int2相等
[int1 –ne int2] int1和int2不想等
[int1 –gt int2] int1大于int2
[int1 –ge int2] int1大于等于int2
[int1 –lt int2] int1小于int2
[int1 –le int2] int1小于等于int2
[file1 –nt file2] file1比file2要新
[file1 –ot file2] file1比file2要旧
[file1 –ef file2] file1与file2有相同的i节点数
复合test命令
复合test命令是用双方括号表示,可以解析shell元字符,如*,?等,复合test命令还可以用&&,||来代替-a,-o命令操作符。如:
name = “tom” #给变量name赋值
[ $name == “tom” ] #测试变量name是否等于”tom”,返回退出状态0
[ $name != “tom” ] #测试变量name是否不等于”tom”,返回退出状态1
[ $name == [Tt]?? ] #由于元字符不会被解释,所以?就是?,返回退出状态1
[[ $name == [Tt]?? ]] #由于元字符被解释,所以?就是任意一个字符,返回退出状态0
friend=”josegh” #给变量friend赋值
[[ $name == [Tt]?? && friend == “jose” ]] #复合表达式,返回退出状态1
Let命令测试数字运算
Let命令含有丰富的类C操作符,lei命令也可以用双圆括号来表示。
X=2
Y=3
((x < 5))
((y >=4))
((x==2&&y==3))
((x+=4))
((x&y))
3) if命令
if命令的格式:
if 命令
then 命令
fi
if后面的命令的退出状态如果是0,那么执行then后面的命令,如果非0,怎跳过then后面的命令,直接执行fi后面的命令。
if后面的命令可以是一条linux指令,也可以是一个test测试表达式,也可以是一个复合test表达式,也可以是一个let表达式。
例:
If grep “$name” /etc/password
Then
Echo “found”
Fi
If [ $answer == “Y” –o $answer == “y” ]
Then
Echo “yes”
Fi
If [[ $answer == [Yy]* || $answer == “Maybe” ]]
Then
Echo “got”
Fi
If (( $# <= 2 ))
Then
Echo “parameter error”
Fi
If/elif/else格式
If 命令
Then 命令组
Elif 命令
Then 命令组
Else 命令组
Fi
Case命令
Case命令是一个分支测试命令,case变量的值与v1,v2,v3…逐一比对,如果相等,就执行该值后面的命令,直到遇到双分号,然后执行esac后面的命令。如果没找到匹配的值,就执行 *) 后面的命令。Case表达式里可以包含shell元字符,也可以用竖杠 | 将两个值相或。Case命令格式:
Case 变量 in
值1)
命令组
;;
值2)
命令组
;;
值*)
命令组
;;
esac
4) for循环命令
for循环格式:
for 变量 in 词表
do
命令
Done
5) while循环命令
while命令对紧跟在它后面的命令进行测试,如果退出状态为0,那么执行do和done之间的命令,然后再跳到while命令后面的命令进行测试,如此往复,直到while后面的命令退出状态为非0。
while命令格式:
while 命令
do
命令
done
6) select循环命令
select命令用于生成菜单选项。格式:
select var in wordlist
do
命令
done
7) 循环重定向和管道
while 命令
do
命令
done > file
while 命令
do
命令
done | 命令
12. Grep
a) grep即全局查找正则表达式并打印出结果行,grep通过正则表达式匹配,将匹配的结果的行打印出来,所以正则表达式是基础。
b) grep元字符
i. 字符串匹配字符串本身
grep tom /etc/password
ii. 字符串中有空格时,须放在引号中
grep “tom jack” /etc/password
iii. ^匹配行开始
grep ‘^hello’ filename
iv. $匹配行结尾
grep ‘ss$’ filename
v. . 匹配任意一个字符
grep ‘l..e’ filename
vi. *匹配0或多个字符
grep ‘s*’ filename
grep tom d* #在所有以d开头的文件中查找
vii. [] 匹配一组字符中的任意一个
viii. [^] 匹配不再这一组字符中的字符
ix. \< 匹配词首,可以在行中
x. \> 匹配词尾,可以在行中
xi. \(..\) 匹配一个分组,可以回溯引用
grep ‘^s\([Hh]ello\).*\1’ filename #\1匹配前面的分组
xii. \{m\} \{m,\} \{m,n\} 匹配重复字符
c) grep 选项
i. –b 在每一行前面加上其所在的块号
ii. –c 显示匹配到的行的数目,而不显示行的内容
iii. –h 不显示文件名
iv. –i 忽略大小写
v. –l 只列出匹配行所在的文件名
vi. –n 在每一行前面加上所在文件的行号
vii. –s 无声操作,只显示报错信息
viii. –v 反向查找