十二章-shell脚本"/>
《鸟哥私房菜》-第十二章-shell脚本
文章目录
- shell脚本介绍
- 脚本的编写和执行
- 脚本的编写
- 脚本的执行
- shell脚本的练习
- 交互式脚本
- 数值计算
- 判断式
- 使用test命令
- 使用判断符号[]
- shell脚本的默认变量
- 条件判断式
- if…then
- case…esac
- function
- 循环loop
- 固定循环
- 不定循环
- shell脚本的跟踪与调试
在Linux中,shell脚本常用来帮助我们自动管理系统,但对于数值计算,shell脚本的效率较为低下
shell脚本介绍
shell脚本:利用shell功能所编写的一个程序,使用纯文本文件,将shell的命令写在里面,搭配以正则表达式、管道命令、数据流重定向等功能达到我们管理系统的目的。
脚本的编写和执行
脚本的编写
-
在进行脚本文件(sh文件)的编写时,我们要注意一些事项:
- shell脚本中的命令是从上而下、从左到右地分析和执行
- 命令、选项、参数间的多个空格都会被忽略掉
- 空白行也会被忽略掉
- 如果读取到一个Enter(即CR),则开始该行或该串命令
- 如果需要换行,则使用 \Enter,对enter进行转义,避免直接执行命令
- # 之后的内容作为注释
-
脚本的一般构成:
- #!/bin/bash : 声明该shell脚本使用的shell名称
- 程序内容的说明:内容功能、版本信息、作者及联系方式、文件日期、历史记录
- 环境变量的声明与设置(使我们可以直接执行外部命令)
- 程序部分:编写代码,实现功能
- 返回执行结果:exit 0(exit 命令使程序中断,退出当前进程,并返回一个值给系统)
基于以上,我们首先要养成良好的编程习惯
脚本的执行
脚本的执行有多种方法:
- 直接命令执行(即直接输入文件名即可),但需要 rx 权限
- 绝对路径、相对路径执行,需要 rx 权限
- 使用bash来执行,sh filename.sh ,需要 r 权限
- source filename.sh,需要 r 权限
在这里我们需要区分一下使用bahs和source两种方式的区别:
当我们使用bash来执行脚本时,脚本会使用一个新的bash环境来执行,执行完毕后会自动退出该子bash,也就是说,在脚本中新建的变量只存在于子bash中,当脚本执行完毕,变量也会消失。
不同的是,当我们使用source命令时,是直接在当前bash中执行脚本,也就是说新建的变量会存在于当前bash中
shell脚本的练习
交互式脚本
我们可以使用 read实现用户与脚本的交互
read -p "please input a number" number
# 提示用户输入一个数字,存储在number这个变量中
数值计算
在shell中进行数值计算,有两种方式(但注意的是,在shell中只能进行整数间的计算,shell的数值计算功能比较low):
-
使用declare命令
declare -i total=${var1}*${var2} # 计算var1与var2的乘积
-
使用 $((计算式))
$((${var1}*${var2}))
判断式
使用test命令
test命令可以用来:
- 判断某个文件名的文件类型
- 检测文件的权限
- 比较两个文件
- 两个整数间的判断
- 判定字符串的数据(如是否为字符串,两字符串是否相同)
- 多重条件判定
test -e filename # 判断该文件名是否存在
使用判断符号[]
注意事项:
- 中括号中每个组件间都需要用space分隔(包括中括号)
- 在中括号中的变量,最好以双引号引起来
- 在中括号中的常数,最好以单或双引号引起来
示例:
[ "${var1} == "${var2}" ] # 判断var1与var2是否相同,相同返回0
shell脚本的默认变量
我们知道在命令后面可以接不同的参数,以实现不同的功能。此外,在shell脚本文件名后也可以带有参数,实现不同的功能。
如: /etc/init.d/network restart # 重新启动/etc/init.d/network程序
- Linux脚本针对参数设置了一些变量名称:
filename opt1 opt2 opt3 ...
$0 $1 $2 $3 ... # $0代表文件名,$1代表参数一,$2代表参数二
此外:
- $#:代表参数总个数
- $@:代表"$1"$2"$3",即所有的参数内容
-
shift:参数变量号码偏移
使用shift + 数字 代表拿掉最前面的几个参数的意思
条件判断式
if…then
在if…then中使用了判断式,来进行条件判断,语法如下:
if [ 条件判断式1 ]; then代码块1
elif [ 条件判断式2]; then代码块2
elif 代码块3
fi
case…esac
与c++中switch语句类似,语法如下:
case $变量名称in"第一个变量内容") 代码块1;; # 代表一种情况的结束"第二个变量内容")代码块2;;*) # 代表其他所有值代码块3;;
esac
function
- function可以将一个功能封装起来,避免代码的冗余,语法如下:
function f_name() {代码块
}
值得注意的是:由于在shell中命令的执行是从上到下、从左到右,所以函数的定义一定要放到代码的最前面,避免使用时找不到定义的函数
-
function的内置变量
函数名代表$0,后续的变量代表$1,$2….
循环loop
循环分为两种,一种是事先循环次数已知的循环,另外是事先循环次数未知
固定循环
-
while do done
while [ condition ] do代码块 done # 条件满足时,执行循环
-
until do done
until [ condition ] do代码块 done # 直到条件满足,中止循环
不定循环
-
for do done
for var in con1 con2 con3... do代码块 done # var的值在con1、con2、con3中遍历
-
for do done 的数值处理
for (( 初始值;限制值;赋值运算 )) do代码块 done 如: for (( i=1; i<=100; i++)) doecho "print" done
shell脚本的跟踪与调试
shell脚本同样也可以先进行调试,再执行,需要使用sh命令
sh [-nvx] scripts.sh
-n :不执行脚本,仅检查语法问题
-v :执行脚本前,先将脚本文件的内容打印在屏幕上
-x :将使用到的脚本内容打印到屏幕上
常使用sh -x scripts.sh 来调试shell脚本
更多推荐
《鸟哥私房菜》-第十二章-shell脚本
发布评论