一,前言
摘抄自《Shell脚本学习指南中文PDF版》
Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型的、特定的工作。一旦你找出完成工作的方法,可以把用到的命令串在一起,放在一个独立的程序或script中。脚本编程语言与编译型语言区别在于脚本编程语言通常是解释型的,这类程序的执行,是有解释器读入程序代码,而编译型语言则是编译执行,将源代码转换成目标代码,便可以直接执行,使用脚本语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象,缺点是执行效率通常不如编译型语言。
二,初识Shell编程
Shell的基本概念
2.1 shell命令
一个简单的Shell命令,如“mkdir dir1 dir2 dir3 dir4” 由命令本身、参数和空格构成
复杂的Shell命令是由简单的命令以多种方式组织在一起的,例如,管道把一个命令的输出传递给另外一个命令作为输入、循环或条件结构,如:
cat book_to_read | grep "english" > mybook
该命令通过管道把cat命令的输出送给grep作为输入。grep命令在输入字符串中查找子字符串english,通过重定向把所有包含字符串english的行写入到mybook文件中
下面附上一个简单的Shell脚本,建立hello文件,文件内容如下:
#!/bin/bash
#the simple case -hello world
echo Hello World
为了使当前文件有可执行的权限,输入以下命令:
sh hello
chmod u+x hello
运行脚本文件,如下图所示:
脚本内容解释:#!说明这个文件类型的,Linux 系统根据#!及该字符串后面的信息确定该文件的类型,在#!之后是一个路径名,这个路径名指定了一个解释脚本中命令的程序,“/bin/BASH”就表明该文件是一个BASH程序 ,需要由/bin下的BASH程序来解释运行。#表示注释,echo语句的功能就是把echo后面的字符串输出到标准输出中。
2.2 Shell语法
如果输入没有被注释掉,那么Shell将读取该输入并且把它分割成字(word)和操作符,然后引用规则来定义输入的每个字符的意义。
2.3 Shell扩展
Shell扩展在每个命令行被分割成记号(tokens)后运行。
2.4 重定向
在一个命令运行之前,它的输入和输出可能会重定向为使用一个由Shell解释的特殊符号。
2.5 Shell函数
Shell函数是一种具有特定功能的一系列语句(命令)的集合,像普通命令一样运行。事实上,BASH在运行脚本的时候,若发现一个函数的定义,则它将函数保留,并作为一条命令,在后面遇见该函数名时,便直接运行该函数,所以函数需要先定义,再调用。
2.6 Shell变量
Shell变量是一个存储值的实体,就是一个存储了名字的参数,引用变量用 ,如 STR,但是更为标准的是${STR}。BASH中的变量可以不被定义直接使用的,所以也就没有类型之说,一个变量既可以被定义为字符串,也可以被再定义为整数。
2.7 Shell脚本
Shell脚本与Windows下的批处理类似,就是一堆命令的集合,方便一次性运行的程序文件。
三,判断和递归
3.1 判断的用法
判断的语法由if、elif、then、fi所构成,示例如下:
#!/bin/bash
if [ $1 -eq 1 ]; then
echo "yes 1"
elif [ $1 -eq 2 ]; then
echo "yes 2"
else
echo "no"
fi
这是简单的判断决定输出,运行结果如下:
3.2 循环的用法
在Shell脚本中使用的循环有case、for、while和until,这里介绍for和while这两个循环
while语法
while [ 条件 ] ;
do
命令或动作
done
上面的中括号[]中的条件不能和括号连在一起,而必须加上空格。下面附上一个示例:
#!/bin/bash
echo "please input n to computer 1+2+....+n"
read -r n
x=1
sum=0
while [ $x -le $n ];
do
sum=`expr $sum + $x`
x=`expr $x + 1`
done
echo "sum=" $sum
在Shell脚本中,所有的变量都是文字形态,因此要作为数值使用,必须要加上expr变量,而且表达式必须加上反引号。在本示例中用read -r 读取输入变量n,-le表示数值的小于或等于。
for语法
for item in list
do
命令或动作
done
示例,判断当前目录下的所有对象是一般文件还是文件夹:
#!/bin/bash
for ff in *;
do
if [ -f $ff ];then
echo "$ff is a file"
elif [ -d $ff ];then
echo "$ff is a directory"
else
echo "$ff is not a file , not a directory"
fi
done
资料来源《Linux指令与Shell编程编程范例速查手册》