Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190105
  • 博文数量: 24
  • 博客积分: 418
  • 博客等级: 一等列兵
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-27 01:19
文章分类

全部博文(24)

文章存档

2013年(7)

2012年(17)

分类:

2012-03-28 23:35:57

原文地址:linux shell 编程 作者:kinghannah

1 编程入门-----shell的简介。
 
    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。

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服务。

  

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

fjsm20Linux2012-03-29 01:26:12

有个错误:在 2.3局部变量中声明函数少了()应该是 function fucn1(){~}