《鸟哥私房菜》-第十二章-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命令可以用来:

  1. 判断某个文件名的文件类型
  2. 检测文件的权限
  3. 比较两个文件
  4. 两个整数间的判断
  5. 判定字符串的数据(如是否为字符串,两字符串是否相同)
  6. 多重条件判定
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++))
    do
    	echo "print"
    done
    
shell脚本的跟踪与调试

shell脚本同样也可以先进行调试,再执行,需要使用sh命令

sh [-nvx] scripts.sh
-n :不执行脚本,仅检查语法问题
-v :执行脚本前,先将脚本文件的内容打印在屏幕上
-x :将使用到的脚本内容打印到屏幕上

常使用sh -x scripts.sh 来调试shell脚本

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值