Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168261
  • 博文数量: 40
  • 博客积分: 888
  • 博客等级: 准尉
  • 技术积分: 396
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 10:17
文章分类
文章存档

2013年(10)

2012年(10)

2011年(11)

2010年(9)

分类: LINUX

2010-09-09 12:04:04

 
 
有关shell的东西   好  
  
 
     shell编程学习
 
 

1.  Shell是用户与系统内核之间的接口。内核在系统引导时加载入内存,当用户登陆后,系统启动shell,将shell加载入内存,然后等待用户输入命令。Shell解释并执行命令,实现用户与内核的交互。

2.  编写命令可以在命令提示符后直接输入,也可以将命令放入一个文件内,这叫做shell脚本。Shell脚本可以包含判断,循环等编程结构。

3.  UNIX shell分为3类:Bourne shellKorn shellC 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)        内置命令testlet

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]        string1string2都为真

[string1 –o string2]        string1string2有一个为真

[int1 –eq int2]               int1int2相等

[int1 –ne int2]               int1int2不想等

[int1 –gt int2]               int1大于int2

[int1 –ge int2]               int1大于等于int2

[int1 –lt int2]                int1小于int2

[int1 –le int2]               int1小于等于int2

[file1 –nt file2]             file1file2要新

[file1 –ot file2]             file1file2要旧

[file1 –ef file2]             file1file2有相同的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,那么执行dodone之间的命令,然后再跳到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    反向查找

 
 
 
 
 
阅读(1219) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~