通常情况下,从命令行每输入一次命令就能够得到系统的响应,如果需要一个接着一个地输入命令才能得到结果的时候,这样的做法效率很低。使用shell脚本就可以很好的解决这个问题。
一 shell程序的创建
使用 shell 脚本可以将各种命令组合在一起,形成功能更完整、更便于使用的新命令。
shell 程序不需要编译即可执行。由于 shell 程序用的是外部命令与 bashshell 的一些默认工具,所以,它常常会去调用外部函数库,因此,运算速度比不上传统的程序语言,不适合处理大量数据运算。
1.语法基本介绍
shell程序基本语法较为简单,主要由开头部分 注释部分以及语法执行部分组成。
开头:shell程序必须以下面的行开始(必须放在文件的第一行)
#!/bin/bash
符号“ #!” 用来告诉系统它后面的参数是用来执行该文件的程序,在这个例子中使用 /bin/bash来执行程序。要是脚本可执行,需赋予该文件可执行的权限,使用下面的命令文件才能执行。
# chmod u+x filename
注释:以“#”开头的句子表示注释,知道这一行的结束,建议在程序中使用注释。如果使用注释,那么即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。
2.一个简单shell程序的创建过程
shell程序就是放在一个文件中的一系列linux命令和实用程序,在执行的时候,通过linux系统一个接着一个解释和执行每个命令,这和windows系统下的批处理程序非常相似。
创建文件:使用vi创建文件,或者使用touch创建文件
eg:vi file1
内容如下:#!/bin/bash
echo “Mr.$USER ,Today is:”
date
echo Wish you a lucky day!
创建文件,并打开文件对其进行编辑。关于vi的使用在此不再详细介绍。
设置文件可执行权限:
# chmod u+x file1
执行shell程序:
# file1
如果不设置文件的可执行权限,那么需要使用bash命令告诉系统它是一个可执行的脚本。 # bash file1
二 shell变量
使用变量可以保存有用信息,用户也可使用变量改变自身的工作环境。
按照变量的作用来分,可以分为 :本地变量 环境变量 特殊变量 。调用变量时则应在变量名前加一个美元符号( $ )。使用 set 命令可以查看所有的本地变量和环境变量。
1.本地变量:本地变量,也称为用户自定义变量,是在当前 shell 环境,当前进程内有效的变量。当用户注销,或者启用子 shell 、子进程时不起作用。
定义本地变量:变量名 = 变量值 (若等号两边有空格,则必须使用引号括起来)
eg:# s1=hello
# s2=“hello world”
变量设置的规定:
1. 变量与变量值以等号“ =” 来连接。
2. 等号两边不能直接接空格。
3. 变量名称只能是英文字母、下划线与数字,但数字不能是开头字符。
4. 若有空格,可以使用双引号或单引号将变量内容结合起来。
readonly 命令
有时需要在说明一个变量并对它设置为一个特定值后就不再改变它的值时,可以用下面的命令来保证一个变量的只读性。
# readonly 变量名
read 命令
语法: read [-pt] 变量名
功能:读取来自键盘输入的变量。
参数:-p :后面可以接提示信息-t :后面可以接等待的秒数。为了防止一直等待用户。
显示本地变量
变量的显示使用 echo 命令,格式如下:
echo $ 变量名 或 echo ${ 变量名 }
释放本地变量
释放本地变量时使用 unset 命令,格式如下: unset 变量名
2.环境变量
环境变量,也称为系统变量。它与本地变量的差别在于,可以用于所有用户进程。也就是可以将其值传送给 Shell 运行的其他命令或脚本使用。这些环境变量在 shell 开始执行的时候就已经定义了,用户还可以重新定义这些变量。使用 env 命令查看当前系统中定义的环境变量。
常见的几个环境变量
变量名 含义
HOME 用户主工作目录
HOSTNAME 主机名
COLUMNS 每屏幕的列数
LINES 每屏幕行数
PATH 搜索目录。如果用户输入的命令前没有加上路径指引,则系统会自动在此变量定义的搜索目录下依次寻找对应的可执行文件
PPID 父进程 ID
PS1 主命令提示符
PS2 从命令提示符,默认为 “ >”
PWD 当前目录
SHELL 当前用户所使用的 shell 程序
UID 用户 ID
RANDOM 随机数变量,在 bash 环境下,介于 0~32767 之间
PS1 变量的特殊符号
PS1=‘[\u@\h \W]\$ ’
\u : 当前用户的账号名称
\h : 仅取主机名的第一个名字。
\W :工作目录名称,仅列出最后一个目录名
\$ : 提示符,如果是 root 时,提示符为 # ,否则就是 $ 。
export 命令
用 export 命令,可以把用户变量设置为环境变量,格式为:export 变量名
也可以在给变量赋值的同时使用 export命令,格式为:export 变量名 = 变量值(若等号两边有空格,则必须使用引号括起来).
3.特殊变量
某些变量在一开始执行脚本时就被设定且不再改变,它们被称为特殊变量。用户只能根据 shell 的定义来使用这些变量,而不能重新定义它们。所有的特殊变量都是由 $ 和另一个符号组成的。
常见的几个特殊变量
特殊变量名 说明
$# 存储 shell 程序中命令行参数的个数
$? 存储 shell 中上一个程序执行的返回值( 0表示命令执行成功,非 0 有问题)
$[1-n] 存储第 [1-n] 个命令行参数
$0 存储 shell 程序自己的名称
$* 存储 shell 脚本的所有参数(不包含 $0 )
$$ 存储 shell 脚本的进程号( pid )
shift 命令
命令 shift 可以移动命令行参数。运行 shift 后,把每个命令行参数向左移动一个位置,即 $2 、 $3...依次变为 $1 、 $2... ,原先的 $1 将被丢掉。
三. 特殊符号
1. 引用符号
在 bash 中,许多字符有特殊的含义。如果希望 bash 忽略某些字符的特殊含义,可以使用一种称为“引用”的技术,通知Shell 暂时忽略被引用字符的特殊含义,将其作为普通字符处理。Shell 在使用“引用”时用到三种字符:转义符“ \” 、单引号“’”和双引号“””.
引用符号 1 — 转义符 “ \”
将转义符“ \” 放在 Shell 特殊字符之前,则 Shell 忽略该字符原有的特殊含义。用这种方式时,必须在每一个欲忽略其特殊含义的特殊字符之前添加一个“ \” 字符
引用符号 2 — 单引号 “’”
将字符串放在一对单引号之间,则单引号内的所有字符的特殊含义都被忽略,而只作为普通字符解释。
引用符号 3 — 双引号 “””
使用双引号的引用与单引号的类似,括在双引号内的大部分特殊字符将被看作普通字符,但也有一些特殊字符即便用双引号括起来之后仍然保留着其特殊的意义,比如$ 、 \ 、”和 ` 。
eg:# string=“$PATH and \$PATH”
# echo $string
/usr/bin and $PATH
2. 命令替换符 “ `”
命令替换符“ `” (反引号)的作用跟引用字符的作用相反。反引号括起来的字符串被 Shell 解释为命令行,在执行时, Shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。这个字符所对应的键一般位于键盘的左上角。
eg:# string=“Current directory is `pwd`”
# echo $string
Current directory is /root
3. 符号“#”
在 shell 脚本中,以“ #” 号(注意:后面紧接着是“ !” 号的除外)开头的行表示注释行。shell 脚本必须以类似于下面的行开始(必须放在脚本的第一行):
#!/bin/bash意指使用/bin/bash 作为 shell 解释
四 变量表达式
test
test 是 Shell 程序中的一个表达式,通常用在控制流 for 、while 、 until 、 if 等结构中,用 test 命令去判断文件的存在与性质,变量的相互关系。
语法: test < 表达式 >
如果 < 表达式 > 成立, test 返回 0 ,反之, test 返回一个非 0 值。
test 在以下 4 种情况下使用:字符串比较 两个数值的比较 逻辑操作,可以进行 and/or ,与其他条件联合使用文件操作,例如文件是否存在及文件的状态等.
字符串比较
作用:测试字符串是否相等,长度是否为零,字符串是否为 NULL 。
常用字符串测试的 < 表达式 > 有:
-z <“ 字符串” > : 比较字符串的长度是否等于 0 ,如果等于 0 则为“是”,返回“ 0” ,下同。
-n <” 字符串” > : 比较字符串的长度是否大于 0 ,如果大于 0 则为“是”。
< 字符串 1> = < 字符串 2> :比较两个字符串是否相同,相同则为“是”。等号两边要有空格
< 字符串 1> != < 字符串 2> :比较两个字符串是否相同,不同则为“是”。 != 要有空格。
eg:# str1=abcd
# test $str1 = abcd
# echo $?
数字比较
常用于数值比较的 < 表达式 > 有:< 数值表达式 1> < 算符 > < 数值表达式 2> ,此处, < 算符 > 可以是:
-eq : 两者相等。
-he : 两者不等。
-lt :前者小于后者。
-le : 前者小于或等于后者。
-gt : 前者大于后者。
-ge : 前者大于或等于后者。
eg:# int1=1234
# int2=01234
# test $int1 –eq $int2
# echo $?
文件操作
文件测试表达式通常是为了测试文件的文件操作逻辑,测试符号如下。
-d :对象存在且为目录,则返回值为“是”。
-f : 对象存在且为文件,则返回值为“是”。
-L :对象存在且为符号连接,则返回值为“是”。
-r :对象存在且可读,则返回值为“是”。
s :对象存在且长度非 0 ,则返回值为“是”。
-w :对象存在且可写,则返回值为“是”。
-x :对象存在且可执行,则返回值为“是”。
! :测试条件的否定。
eg:# cat /dev/null>empty
# cat empty
# test –r empty
# echo $?
# test –s empty
# echo $?
# test ! –s empty
# echo $?
逻辑测试
常用于逻辑测试的 < 表达式 > 有:
! < 表达式 > : < 表达式 > 不成立。
< 表达式 1> -a < 表达式 2> : < 表达式 1> 与< 表达式 2> 同时成立。
< 表达式 1> -o < 表达式 2> : < 表达式 1> 或< 表达式 2> 成立。
eg:# test –r empty –a –s empty
# echo $?
// 结果显示 1 ,表示文件 empty 存在且只读以及长度为非 0 是不对的。