Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247723
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2012-02-25 09:48:35

什么是Shell?

简单地讲,就是命令解析器,将用户输入的指令转换为相应的机

器能够运行的程序。种类

vBourne shell (sh)

vKorn shell (ksh)

vBourne Again shell (bash)

vC shell (包括csh and tcsh)

vTENEX/TOPS C shell (tcsh)

 

Shell脚本

Shell脚本是一个包含一系列命令序列文本文件。当运行这个脚本文件时,文件中包含的命令序列将得到执行

 

语法

Shell脚本的第一行必须是如下格式:

v#!/bin/sh

符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。

chmod +x filename

 

注释

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。如果使用了注释,即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。

 

变量

shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明,s1:

 

#!/bin/sh

#set variable a

a="hello world"

# print a

echo "A is:"

echo $a

 

有时候变量名很容易与其他文字混淆,比

如:

S13:

num=2

echo "this is the $numnd

思考:输出?Why?

num=2

echo "this is the $numnd"

这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:

num=2

echo "this is the ${num}nd"

这将打印: this is the 2nd

 

默认变量

v$# :传入脚本的命令行参数个数

v$* :所有命令行参数值,在各个参数值之间留有空格

v$0 :命令本身(shell文件名)

v$1 :第一个命令行参数

v$2 :第二个命令行参数

 

S2:

#!/bin/sh

echo "number of vars:"$#

echo "values of vars:"$*

echo "value of var1:"$1

echo "value of var2:"$2

echo "value of var3:"$3

echo "value of var4:"$4

运行./s2 1 2 3 4

输出结果:?

 

局部变量

在变量首次被赋值时加上local 关键字可以声明一个局部变量,例s3:

#!/bin/bash

hello="var1"

echo $hello

function func1 {

local hello ="var2"

echo $hello

}

func1

echo $hello

输出:?

 

变量(注意)

1. 变量赋值时,=左右两边都不能有空格

2. BASH 中的语句结尾不需要分号

 

If语句

v if [ expression ]

then

#code block

Fi

 

v if [ expression ]

then

#code block

else

#code block

Fi

 

v if [ expression ]

then

#code block

else if [ expression ]

then

#code block

else

#code block

fi

fi

 

if [ expression ]; then

#code block

elif [ expression ]

then

#code block

else

#code block

fi

fi

 

比较

比较操作整数操作字符串操作

相同-eq =

不同-ne !=

大于-gt >

小于-lt <

大于或等于-ge

小于或等于-le

为空-z

不为空-n

 

在bash 或sh 中 可以用 [ $a == $b ]判断是否相等!


例:

比较整数ab是否相等:if [ $a = $b ] (也可用eq

判断整数a是否大于整数bif [ $a -gt $b ]

比较字符串ab是否相等:if [ $a = $b ]

判断字符串a是否为空: if [ -z $a ]

判断整数变量a是否大于bif [ $a -gt $b ]

注意:

1. []符号的左右都留有空格

2. =左右都有空格

 

判断

-e 文件已经存在

-f 文件是普通文件

-s 文件大小不为零

-d 文件是一个目录

-r 文件对当前用户可以读取

-w 文件对当前用户可以写入

-x 文件对当前用户可以执行

S5

#!/bin/sh

folder=/home

[ -r "$folder" ] && echo "Can read $folder"

[ -f "$folder" ] || echo "this is not file"

 

For循环

for 循环结构与C 语言中有所不同,在BASH for 循环的基本结构是:

for var in [list]

do

#code block

done

其中$var 是循环控制变量,[list] var 需要遍历的一个集合,do/done 对包含了循环体,相当于C 语言中的一对大括号。另外如果do for 被写在同一行,必须在do 前面加上;。如:

 for $var in [list]; do

 

v S7:

#!/bin/bash

for day in Sun Mon Tue Wed Thu Fri Sat

do

echo $day

done

 

v 如果列表被包含在一对双引号中,则被认为是一个元素,S8:

#!/bin/bash

for day in "Sun Mon Tue Wed Thu Fri Sat

do

echo $day

done

 

注意

上面的例子中,在for 所在那行,变量day 是没有加"$" 符号的,而

在循环体内,echo 所在行变量$day 是必须加上"$" 符号的。

 

while循环

while 循环的基本结构是:

while [ condition ]

do

#code block

Done

 

until循环

until 循环的基本结构是:

until [ condition ]

do

#code block

done

while until的区别在于while是为真时执行,until是为假时执行

 

Case语句

BASH 中的case 结构与C 语言中的switch 语句的功能比较类似,可以用于进行多项分支控制。

case "$var" in

condition1 )

;;

condition2 )

;;

* )

default statments;;

esac

 

#!/bin/bash

echo "Hit a key, then hit return."

read Keypress

case "$Keypress" in

[A-Z] ) echo " Uppercase letter";;

[a-z] ) echo " Lowercase letter";;

[0-9] ) echo "Digit";;

* ) echo "Punctuation, whitespace, or other";;

esac

 shell详解.doc  
阅读(1119) | 评论(0) | 转发(0) |
0

上一篇:Linux目录简介

下一篇:grep

给主人留下些什么吧!~~