脚本

who?

一个文件,批量按序依次执行文件中的命令

脚本语言:Shell、Python、vb、bat

一、Shell(命令解释器)

充当翻译角色,将用户操作转换为内核识别操作

脚本的重要性:用于完成自动化批量操作,减少管理员工作量

脚本的组成

1)声明解释器(#!/bin/bash)

2)批量化操作

3)注释(#)

4)变量、判断等

例:

mkdir /sh

vim /sh/test1.sh

#!/bin/bash //声明以下命令采用/bin/bash解释器执行

cd /tmp/

mkdir ./a

touch ./a/aa

ls -R /tmp

执行:

source /sh/test1.sh 或 . /sh/test1.sh //执行脚本文件(脚本文件不需具有执行权限)

sh -x /sh/test1.sh //执行脚本文件(脚本文件不需具有执行权限,一般用于排错)

chmod +x /sh/test1.sh && /sh/test1.sh //执行脚本文件(以相对或绝对路径执行,脚本文件必须具有执行权限)

注:脚本文件一般后缀为.sh

输入

通过输入设备将将数据交由硬件处理

输入设备:鼠标、键盘、数位板、话筒、摄像头

默认设备:键盘、鼠标

文件描述编号:0

设备文件:/dev/stdin

例:

passwd root 0</dev/stdin //设置root的密码从默认输入设备读取(0</dev/stdin可忽略,系统自动填写)

passwd root </dev/stdin //效果同上

passwd root //效果同上

重定向输入:更改输入设备为文件

vim /sh/a

123 123

passwd root 0</sh/a //设置root的密码从/sh/a文件中读取

passwd root </sh/a //效果同上

正确输出

将硬件处理结果通过输出设备显示

输出设备:显示器、打印机、音响、耳机

默认设备:显示器

文件描述编号:1

设备文件:/dev/stdout

例:

ls -l 1>/dev/stdout //将ls -l命令的正确输出结果输出到默认输出设备(1>/dev/stdout可忽略,系统自动填写)

ls -l >/dev/stdout //效果同上

ls -l //效果同上

重定向正确输出:更改输出设备为文件

例:

ls -l 1>/sh/hehe //将ls -l命令的正确输出结果输出到/sh/hehe文件中

ls -l >/sh/hehe //效果同上

错误输出

将硬件处理结果通过输出设备显示

输出设备:显示器、打印机、音响、耳机

默认设备:显示器

文件描述编号:2

设备文件:/dev/stderr

例:

ls -l /eee 2>/dev/stderr //将ls -l /eee命令的错误输出结果输出到默认输出设备(2>/dev/stderr可忽略,系统自动填写)

ls -l /eee>/dev/stderr //效果同上

ls -l /eee //效果同上

重定向错误输出:更改输出设备为文件

例:

ls -l /eee 2>/sh/err //将ls -l /eee命令的错误输出结果输出到/sh/err文件中

混合输出

将硬件处理结果通过输出设备显示

输出设备:显示器、打印机、音响、耳机

默认设备:显示器

文件描述编号:&

设备文件:/dev/stdout

例:

ls -l /tmp /a &>/dev/stdout //将ls -l /tmp /a命令的正确及错误结果输出到默认输出设备(&>/dev/stdout可忽略,系统自动填写)

ls -l /tmp /a //效果同上

重定向混合输出

例:

ls -l /tmp /a &>/sh/huohuo //将ls -l /tmp /a命令的正确及错误将结果输出到/sh/huohuo文件中

ls -l /tmp /a 1>/sh/suss.log 2>/sh/error.log //将ls -l /tmp /a命令的正常结果保存到/sh/suss.log,将错误结果保存到/sh/error.log

注:如需将输出结果重定向,并不想保存到文件中时,可重定向到/dev/null(Linux下的特殊文件,相同于Windows的回收站,但内容自动清空)

二、变量

1)优点:简化用户操作、灵活

2)分类:

a.自定义变量:用户自行定义,可添加删除、使用

b.环境变量:有系统维护,设置环境变量值;如PATH(env可查看当前系统所有环境变量)

c.位置变量:通过命令行给脚本传递参数

d.预定义变量:Shell中内置变量,只能使用,不可更改

自定义变量:

格式:变量名=变量值

引用:$变量名

案例:

vim /sh/hehe.sh

#!/bin/bash

R_DIR=/boot/

ls -l $R_DIR

注:变量名不能以数字、特殊符号取名;建议使用大写字母

'':单引号,强引用,不会加载变量的值

" ":双引号,加载变量的值

例如:

A=1

B=2

echo '$A$B' //屏幕输出$A$B

echo "$A$B" //屏幕输出12

unset 变量名 //取消变量的定义(一般用于系统的变量定义)

脚本流程

1)命令行测试

2)编写脚本文件

3)添加必要的变量

4)测试

5)使用

读取用户输入:

read [ -p "提示信息" ] 变量名

例如:

vim bak.sh

read -p "请输入需备份位置:" FILE

tar -zcvf /tmp/hehe.tar.gz $FILE

source bak.sh

变量的运算:

expr 变量1 运算符 变量2 ...

注:expr不支持小数点

运算符:

+:加法

-:减法

*:\转义,乘法

/:除法

%:求余运算、求模运算

bc命令:

bc //进入运算环境

scale=8 //指定保留的小数点位数

1*2-(2/2)

quit //退出

环境变量:

由系统创建并维护的变量

env //查看当前系统所有的环境变量

PATH //指明软件或命令的所有路径

PATH=/tmp/aa:$PATH //新增命令搜索路径

vim /etc/profile

最后增加:PATH=/tmp/aa:$PATH //将新增路径设置为永久生效

位置变量

$0 - $9

$0:命令名或脚本名

$1 - $9:脚本参数的位置,第一个参数、第九个参数

预定义变量

$*:所有参数的值

$#:参数的数量

$?:判断上条命令执行结果,0为正确,非0执行错误

案例一:

backup.sh

#!/bin/bash

tar -zcvf /tmp/111.tar.gz $* &>/dev/null

echo "已执行$0脚本"

echo "共完成$#个对象的备份"

echo "具体内容为$*"

案例二:

vim server.sh

#!/bin/bash

read -p "输入需要的操作:stop | restart | start" AA

read -p "输出需要的服务:" BB

/etc/init.d/$BB $AA