2012年(7)
分类:
2012-03-28 22:47:21
原文地址:linux shell 编程 作者:kinghannah
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。
利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。
#号开头的语句是注视行。与C编程中的//一样。
编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:
chmod +x filename.sh
执行脚本的方法是:
./filename.sh
下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。
#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a
2 shell 编程 对变量的赋值。
shell对变量的赋值,所有的变量都是由字符串组成,不需要对变量名预先声明,而且有很多关键字供编程者使用。下面列举例子详细说明。 在终端下建立文件 #vi s2.sh
#!/bin/sh
#set a variable a
a="hello world"
#print a
echo "A is :"
echo $a
在这个程序当中,可以看到shell编程与C编程的区别,没有那么严格的语法,在每句不需要加“;”,
而且在shell中引用变量的时候前面加“$”。
2.1 当变量名与其他文字混淆的时候,需要加“{}”
#!/bin/sh
# set a variable num
num=2
echo "the variable num is $numnd"
运行程序后,答案并不是 the variable num is 2nd,而是什么都没有输出。因为bash会寻找numnd变量,但是并没有给这个变量赋值。所以将程序改为:
echo "the variable num is {$num}nd"
2.2 默认变量
$#:传入脚本的命令行参数个数
$*:所有命令行的参数值,而且各个参数值之间有空格表示
$0:命令本身,就是要执行的shell文件名
$1:第一个命令行参数
$2:第二个命令行参数
$3
$4
example:
#!/bin/sh
echo "number of vars:"$#
echo "number of vars:"$0
echo "number of vars:"$*
echo "number of vars:"$1
echo "number of vars:"$2
echo "number of vars:"$3
运行./file 11 22 33
输出结果:
3
file
11 22 33
11
22
33
2.3局部变量
在变量首次赋值是加关键字local可以声明为局部变量。
#!/bin/sh
hello="aa"
echo $hello
function fucn1{
local hello="bb"
echo $hello
}
func1
echo $hello
可以看看结果是?
3 if 语句
if语句在bash中的格式:
if [expression]
then
#code block
else if[expression]
then
#code block
else
#code block
fi
fi
example:
#!bin/sh
FILENAME=
echo "input the file name:"
read FILENAME
if[-c "FILENAME"]
then
cp $FILENAME/dev
fi
此程序的功能是判断输入的file name是不是字符设备文件,如果是,则copy到/dev目录下。
有关if 的参数有很多,不一一列出。
4 for 循环语句
for var in [list]
do
#code block
done
其中var是循环控制变量,[list]是var需要遍历的一个集合。do/done包含了循环体,相当于C语言中的{},形式也可以写成 for var in [list] ;do
example:
#!bin/sh
for day in SUN MON TUE WED THR FRI SAT
do
echo $day
done
如果列表被安排在“”中,则认为是一个元素,即{SUN MON TUE WED THR FRI SAT}会是一个元素。
编写shell程序,实习计算目录下的文件数。
5 while 循环
while[condition]
do
#code block
done
编写 将用户输入的数按倒序方式输出。
until 循环语句与while语句相似,只是执行条件相反了。
6 case 语句
case "$var" in
condition 1)
#code blcok ;;
condition 2)
#code block ;;
condition n)
#code block;;
*)
defaults members;;
esac
#!bin/sh
case"$1"in
'start')
/usr/sbin/apachect1 start ;;
'stop')
/usr/sbin/apachect1 stop ;;
'restart')
/usr/sbin/apachet1 restart ;;
*)
echo "usage $0 start|stop|restart" ;;
esac
此程序的作用是开启关闭http服务。