Shell脚本编程基础!!

【1】shell脚本的基础知识

(1)shell脚本的本质
 编译型语言
 解释型语言
	shell脚本语言是解释型语言
	shell脚本的本质
		shell命令的有序集合
(2)shell 编程的基本过程
 基本过程分为三步:
 step1. 建立 shell 文件
        包含任意多行操作系统命令或shell命令的文本文件;
 step2. 赋予shell文件执行权限
        用chmod命令修改权限;
 step3. 执行shell文件
        直接在命令行上调用shell程序.
(3)实例
 step1: 建立shell文件 (可用任何建立文本文件的方法)
	   $ cat  prog1.sh
	     date
 Step2: 赋予执行权限:  (初始文本文件无执行权限)
	   $ chmod  740  prog1.sh
 Step3: 执行该shell程序
           $ prog1.sh
   		     prog1.sh: not found    
 		     (shell在标准搜索路径中找不到prog1.sh)
 Step4: 指定路径或修改环境变量PATH后执行shell程序
	   $ ./prog1.sh  
	   2009年  12月  16日  星期二  14:52:57  CST

【2】shell变量

(1)shell变量
 shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),
 将任何赋给变量的值都解释为一串字符
					Variable=value
 a.   count=1
 b.   echo $count
 c.   DATE=`date`
 d.   echo $DATE
 (2) Bourne Shell有如下四种变量:
	1) 用户自定义变量 
	2) 位置变量即命令行参数 
 	3) 预定义变量 
	4) 环境变量
 (3) 用户自定义变量
 1) 在shell编程中通常使用全大写变量,方便识别 
	$ COUNT=1
 2) 变量的调用:在变量前加$ 
	$ echo $HOME 
 3) Linux Shell/bash从右向左赋值
	$Y=y
	$ X=$Y
	$ echo $X 
	y	 
 4) 使用unset命令删除变量的赋值 
	$ Z=hello 
	$ echo $Z 
	hello 
	$ unset Z 
	$ echo $Z 
 (4) 位置变量
 $0   与键入的命令行一样,包含脚本文件名
 $1,$2,……$9  分别包含第一个到第九个命令行参数
 $#   包含命令行参数的个数
 $@   包含所有命令行参数:“$1,$2,……$9”
 $?   包含前一个命令的退出状态
 $*   包含所有命令行参数:“$1,$2,……$9”
 $$   包含正在执行进程的ID号
 (5) 常用shell环境变量 
 HOME: /etc/passwd文件中列出的用户主目录 
 IFS:Internal Field Separator, 默认为空格,tab及换行符
 PATH :shell搜索路径
 PS1,PS2:默认提示符($)及换行提示符(>) 
 TERM:终端类型,常用的有vt100,ansi,vt200,xterm等 

【3】说明性语句

(1)shell 程序和语句
 shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。
 说明性语句:
	以#号开始到该行结束,不被解释执行
 功能性语句: 
	任意的shell命令、用户程序或其它shell程序。
 结构性语句:
	条件测试语句、多路分支语句、循环语句、循环控制语句等。             
(2)说明性语句(注释行)
    注释行可以出现在程序中的任何位置,既可以单独占用一行,  也可以接在执行语句的后面. 
 以#号开始到所在行的行尾部分,都不被解释执行. 例如:
	#! /bin/sh 
	#	     ------> 告诉OS用哪种类型的shell来解释执行该程序
	# 本程序说明
	#
	command_1 
	command_2                  # command_2的语句说明
	……
	# 下面程序段的说明
	command_m
	……
	command_n                  # commandn_语句的说明
	……

【4】常用功能性语句

 (1) 常用功能性语句(命令)
read从标准输入读入一行, 并赋值给后面的变量,其语法为:
   		read  var
    把读入的数据全部赋给var
  		read  var1  var2  var3
    把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
 (2) 应用实例
 # example1  for  read
 echo  "Input  your  name: \c"
 read  username
 echo  "Your name is  $username"

 #example2  for  read
 echo "Input  date  with  format  yyyy  mm dd: \c"
 read  year  month  day
 echo  "Today  is  $year/$month/$day,  right?"
 echo  "Press  enter  to  confirm  and  continue\c"
 read  answer
 echo "I  know  the  date,  bye!"
 (3) expr命令
 算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
 例如:
	$ expr  12  +  5  \*  3            反斜线去掉*号的元字符含义
	27
	$ expr  3  -  8  /  2
	-1

	$ num=9
	$ sum=`expr  $num  \*  6 `          反撇号引用命令的运行结果

	$ echo  $sum
	54

【5】测试语句

 (1)test语句
test语句可测试三种对象:
    	  字符串     整数     文件属性
 (2)每种测试对象都有若干测试操作符
例如:
  		test  "$answer"  =  "yes"
  		变量answer的值是否为字符串yes
  		test  $num –eq  18
  		变量num的值是否为整数18
  		test  -d  tmp    
  		测试tmp是否为一个目录名
 (3) 字符串测试
 s1 = s2 	测试两个字符串的内容是否完全一样
 s1 != s2	测试两个字符串的内容是否有差异
 -z s1 	测试s1 字符串的长度是否为0
 -n s1 	测试s1 字符串的长度是否不为0
 (4) 整数测试
 a -eq b 		测试a 与b 是否相等
 a -ne b		测试a 与b 是否不相等
 a -gt b 		测试a 是否大于b
 a -ge b 		测试a 是否大于等于b
 a -lt b 		测试a 是否小于b
 a -le b 		测试a 是否小于等于b
 (5) 文件测试
 -d name    测试name 是否为一个目录
 -e name    测试一个文件是否存在
 -f name    测试name 是否为普通文件
 -L name    测试name 是否为符号链接
 -r name    测试name 文件是否存在且为可读
 -w name    测试name 文件是否存在且为可写
 -x name    测试name 文件是否存在且为可执行
 -s name    测试name 文件是否存在且其长度不为0
 f1 -nt f2  测试文件f1 是否比文件f2 更新
 f1 -ot f2  测试文件f1 是否比文件f2 更旧