1、shell编程基础
shell脚本的本质:shell命令的有序集合
shell脚本编程的3个步骤:
1、建立shell文件
2、赋予shell脚本文件执行权限
3、执行shell 文件
2、变量
Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符。
shell有如下4种变量
1、用户自定义变量
2、位置变量
3、预定义变量
4、环境变量
2.1 用户自定义变量
在shell编程中通常使用全大写变量,方便识别 。注意=左右没有空格
COUNT=1
变量的调用:在变量前加$
echo $HOME
2.2 位置变量
$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 分别包含第一个到第九个命令行参数
${10}~${n}: 存放第十个到第n个命令行参数。
2.3 预定义变量
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态,0正常,1错误
$* 包含所有命令行参数:“$1,$2,……$9”
$$ 包含正在执行进程的ID号
范例
打印执行文件和第一个参数,然后执行ld命令(错误命令),打印上一个命令的执行结果
运行该shell脚本
输出了执行文件和第一个参数,ld执行结果为1
2.4 环境变量
HOME: /etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator, 默认为空格,tab及换行符
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
3 shell程序和语句
shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。
说明性语句:
以#号开始到该行结束,不被解释执行
功能性语句:
任意的shell命令、用户程序或其它shell程序。
结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等。
3.1 说明性语句
说明性语句也就是注释,shell中以#代表注释。在shell文件的第一行为固定格式,告诉系统当前的shell
#!/bin/shell类型
范例
#!/bin/bash
3.2 功能性语句
(1)read
read从标准输入读入一行, 并赋值给后面的变量,其语法为:
. read var
把读入的数据全部赋给var
. read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行
(2)运算符
算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:
反撇号代表引用命令的结果。
运行结果
(3)测试test
test语句可测试三种对象:
字符串 整数 文件属性
每种测试对象都有若干测试操作符
例如:
test "$answer" = "yes"
变量answer的值是否为字符串yes
test $num –eq 18
变量num的值是否为整数18
test -d tmp
测试tmp是否为一个目录名
字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
整数测试
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
文件测试
-d name 测试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 更旧
3.3 控制语句
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等。
(1)if语句
if…then…fi
语法结构:
if 表达式
then 命令表
fi
如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
if…then…else…fi
语法结构为:
if 表达式
then 命令表1
else 命令表2
fi
如果表达式为真, 则执行命令表1中的命令, 再退出if
语句; 否则执行命令表2中的语句, 再退出if语句.
范例
测试1.zip是否是一个目录(当然不是啦)
(2)多路分支语句
多路分支语句case用于多重条件测试, 语法结构清晰自然. 其语法为:
范例:测试第一个参数输入值
运行结果