一、Shell脚本
1.什么是Shell
当命令不在命令行中执行,而是从一个文件中执行的时候 ,该文件就是shell脚本
shell脚本是普通的文本文件,由流程控制逻辑和命令构成,通常以.sh作为后缀名,但不是必须的。
- Shell是一种解释型编程语言,不需要编译,执行时也是按行执行。
- Shell脚本是由解释器解释执行的,常见的解释器有: bash dash ash ksh sh等 注意,每种Shell解释器对shell的语法解释并不完全相同(sh和bash解析器对ll的解释就不同),但基本相同。
- 脚本就是命令的堆砌 就是一堆命令
- 脚本可以接受参数,也可以有变量,也可以有流程控制甚至还有函数
2.shell脚本的编制 ,执行和调试
- 1.编制:使用文本编辑器vi或者vim
- 2.执行:执行前必须为脚本文件添加可执行权限 chmod u+x script-file (加权限) bash script-file 或者 ./script-file
- 3.调试
bash -x -n -v script-file
-n :只读取shell脚本,但不会去执行它,常用来测试脚本语法错误
-x :进入跟踪模式,显示所执行的每一行命令,常用来调试脚本逻辑
-v : 在执行script之前,先将script的内容输出到屏幕上
3.helloword
- Shell中的注释用‘#‘’
- Shell第一行代码:#!/bin/sh 声明这个script使用的shell解释器
创建hello.sh
给权限 chmod a+x shell/hello.sh
运行 chmod a+x shell/hello.sh
#声明解析器
#!/bin/bash
#输出sss
echo 'hello world'
4.测试写备份并清空日志
备份可变文件存放目录/var 下面的log目录,备份成功后,删除原来文件
#!/bin/bash
#复制
cp bbb.log b.log
#删除
rm -rf bbb.log
- 不能动态备份内容
- 备份后的名称不能自定义
- 备份不成功也会生成原文件
二、变量
1. shell中的变量
- shell中其实没有变量 类型,本质上都是字符串
-shell 中也有四种类型的变量
本地变量:仅在当前shell中有用,在shell外部或者子shell中都不可用
环境变量:当前及子shell有用
位置参数变量:脚本的参数或者函数的参数等
特殊变量:脚本内置的具有特殊用途的变量
2. 变量定义和删除和赋值引用
1. 变量定义有以下方式
project= #定义空变量或者清空已有变量
project=/home/workspace #定义变量并赋值
A=1
project=”/home/workspaceKaTeX parse error: Expected 'EOF', got '#' at position 7: {A}” #̲定义变量并赋值,双引号对 ` \无效
#定义变量并赋值,单引号最强,引什么是什么
export project=/usr/redis #将变量声明为环境变量,在子shell中也可以使用
2.变量的删除
变量删除使用语句为:unset project
3.变量赋值引用
1.变量赋值
project=/home/work #变量重新赋值了
2.变量引用
subproj=KaTeX parse error: Expected 'EOF', got '#' at position 17: …project}/sub #̲subproj引用了proje…project/sub #等同于 subproj=${project}
三、位置参数
1. 位置参数变量
位置参数是一组特殊的内置变量,跟在脚本名后面的用空格隔开的每个字符串
$1 表示第1个参数值,……,$9 表示第9个参数值 到第十个就需要加括号了
${10} 表示第10个参数值, ${11} 表示第11个参数值
位置参数的作用
从 shell 命令/脚本 的命令行接受参数
在调用 shell 函数时为其传递参数
实例
#!/bin/bash
# ScriptName: shell文件名称.sh
# To test Positional Parameters & Special Parameters.
echo "Hello,$USER,the output of this script are as follows:"
echo "The script name is : $(basename $0)" # 文件名称
echo "The first param of the script is : $1" # 第一个参数
echo "The second param of the script is : $2"# 第二个参数
echo "The tenth param of the script is : ${10}"# 第十个参数
echo "All the params you input are : $@" # 所有参数 下面有说发
echo "All the params you input are : $*" # 所有参数
echo "The number of the params you input are: $#" # 参数数量
echo "The process ID for this script is : $$" # 进程id
echo "The exit status of this script is : $?" # 状态
2.特殊变量
-
与命令行参数相关
$* 将所有位置参量看成一个字符串(以空格间隔) 。String str= “1 2 3 4”
$@ 将每个位置参量看成单独的字符串(以空格间隔)。“ $ ∗ ”将所有位置参量看成一个字符串(以 *” 将所有位置参量看成一个字符串(以 ∗”将所有位置参量看成一个字符串(以IFS间隔)。
“$@” 将每个位置参量看成单独的字符串(以空格间隔) 。
$0 命令行上输入的Shell程序名。
$# 表示命令行上参数的个数。 -
进程相关
$? 表示上一条命令执行后的返回值
$$ 当前进程的进程号
$! 显示运行在后台的最后一个作业的 PID
$_ 在此之前执行的命令或脚本的最后一个参数
实例
#!/bin/bash
# ScriptName: 脚本名称.sh
#### Set the IFS to | ####
IFS='|'
echo "Command-Line Arguments Demo"
echo "* All args displayed using \$@ positional parameter *"
echo $@
echo "* All args displayed using \$* positional parameter *"
echo $*
echo '* All args displayed using "$@" positional parameter *'
echo "$@" #*** double quote added ***#
echo '* All args displayed using "$*" positional parameter *'
echo "$*" #*** double quote added ***#
结果显而易见
[root@dasic ~]# bash pc.sh 1 2 3 4 5 6 7
Command-Line Arguments Demo
* All args displayed using $@ positional parameter *
1 2 3 4 5 6 7
* All args displayed using $* positional parameter *
1 2 3 4 5 6 7
* All args displayed using "$@" positional parameter *
1 2 3 4 5 6 7
* All args displayed using "$*" positional parameter *
1|2|3|4|5|6|7
打包一个完善的复制删除 功能
#复制删除
#!/bin/bash
#复制后名称
fn=$1
# 被复制的名称
bd=$2
# 打包,处理异常 复制成功 删除用来文件
#df 2 代表前命名执行如果有错误 &&当前面一个命令执行成功 执行后>面
#的目录
cp ${bd} ${fn} 2>error.log && rm -rf ${bd}
注意提示权限
chmod u+x xcp.sh
测试故意错误 错误会被写到 error.log里面
[root@dasic ~]# bash xcp.sh b.log bbb/bb.log
[root@dasic ~]# cat error.log
cp: 无法获取"bbb/bb.log" 的文件状态(stat): 没有那个文件或目录
四、常见的状态和命令
1. 退出/返回状态
1.$?:返回上一条语句或脚本执行的状态
0:成功 1-255:不成功
2.exit 命令用于退出脚本或当前Shell 注意就直接退出用户了
任务都有一个返回值
n 是一个从 0 到 255 的整数
0 表示成功退出,非零表示遇到某种失败
返回值 被保存在状态变量 $? 中
2. 常见的返回状态码
- 0 执行正确
- 1 通用错误 没有识别出来
- 126 命或者脚本没有执行权限
- 127 命令没有找到
- 2参数不存在
3.数据流的重定向
标准输入:代码0,使用 < 或者 <<
标准输出:代码1,使用 > 或者 >>
错误输出:代码2,使用 > 或者 >>
> 表示 写入; >>表示追加 <表示 读入;<<表示结束读入
尝试读取 一个文件内容到另一个中
cat<aaa.log>error.log
读取内容
#!/bin/sh
#这段代码会往hosts文件里追加两行域名的解析
cat >> /etc/hosts << EOF
172.164.118.110 www.baidu.com
154.170.124.121 www.sohu.com
EOF
4.命令的连续执行 && ||
- . && 连起来的命令,后面的命令只有在前一命令执行成功后才执行
- . || 连起来的命令,后面的命令只有在前一命令执行失败后才执行
#!/bin/sh
master_ip=”www.oracle.com111” #主服务器IP地址变量
backup_ip=”www.oracle.com” #备份服务器IP地址变量
uri=”/otn/java/jdk/8u231-b11-demos/5b13a193868b4bf28bcb45c792fce896/jdk-8u231-linux-x64-demos.tar.gz” #要下载的文件
#下载第一个下不来 下第二个
curl -O “https://
m
a
s
t
e
r
i
p
{master_ip}
masterip{uri}” || curl -O “https://
b
a
k
i
p
{bak_ip}
bakip{uri}”
5. if else if elseif for while
大于 -gt (greater than)
小于 -lt (less than)
大于等于 -ge (greater than or equal)
小于等于 -le (less than or equal)
不相等 -ne (not equal)
小练习
if
#!/bin/bash
echo "你原意取我吗,你的答案是$1"
if [ $1 == 1 ]; then
echo ‘原意,嫁妆8练车 10000000000现金’
else
echo '不愿意,这个同性的嫁'
fi
elseif
#!/bin/bash
for i in `ls /root/aaa.log`
do
echo $i
done;
echo'-------------------------------'
for i in aa bb 11 33
do
echo $i
done;
echo'-------------------------------'
for i in {1..10}
do
echo $i
done;
echo'-------------------------------'
for (( i=1 ; i<=10 ; i++ ))
do
echo $i
done;
while
1到n的和
#!/bin/bash
declare -i sum=0;
declare -i j=1;
while (( j<=$1 ))
do
let sum+=j;
let j++;
done
echo "1-$1的和为:$sum"
case
#!/bin/bash
case $1 in
1)
echo '搞笑';;
2)
echo '娱乐';;
3)
echo '新闻';;
*)
echo 'case学习';;
esac
~
6、常用命令awk
awk简介
awk是一个非常棒的数据处理程序,它比较倾向于将一行分成多个‘字段’来处理。
类似 String[] strArray = “a,b,c,d”.split(“,”); strArray[0] strArray[3] 和java的split的方法有点象
数据可以来自标准输入、一个或者多个文件、其他进程的输出
awk从第1行到最后一行逐行扫描,并执行匹配的操作
awk的默认操作是输出匹配行即打印匹配行到标准输出
awk语法
1.awk [选项] ‘BEGIN{语句1;语句2;…} END{语句1;语句2;…} 模式1{语句1;语句2;…} 模式2{语句1;语句2;…} 模式n…’ [文件名]
-F指定分隔符
-f调用脚本
五、
软件安装和维护(Rpm)
概述
RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括RedHat、CentOS、SUSE等Linux的分发版本都有采用,可以算是公认的行业标准了。RPM文件在Linux系统中的安装最为简便。
RPM 最早是由 Red Hat 公司提出的软件包管理标准,最初的全称是 Red Hat Package Manager。后来随着版本的升级又融入了许多其他的优秀特性, 成为了Linux中公认的软件包管理标准。被许多Linux发行使用,如:RHEL/CentOS/Fedora, SLES/openSUSE 等。如今RPM是RPM Package Manager的缩写,由RPM社区(http://www.rpm.org/)负责维护。
RPM的有点在于1.易于安装、升级便利;2.丰富的软件包查询功能;3.软件包内容校验功能;4.支持多种硬件平台
功能
RPM五大功能及组件介绍
- 安装——将软件从包中解出来,并安装到硬盘。
- 卸载——将软件从硬盘清除。
- 升级——替换软件的旧版本。
- 查询——查询软件包的信息。
- 验证——检验系统中的软件与包中软件的区别。
RPM组件:
本地数据库 rpm及其相关的可执行文件 RPM 前端工具,如 yum 软件包文件
基本命令的使用
rpm的常用选项:
- i:安装应用程序(install)
- e:卸载应用程序(erase)
- vh:以####显示安装进度(verbose hash)
- U:升级软件包;(update)
- qa: 显示所有已安装软件包(query all)
RPM命令安装、升级和删除软件
- 1.输出选项:
-v:安装时显示软件名称
-h:使用“#”显示进度 - 2.rpm file 的URL支持
jdk8的rpm - 3.rpm包的安装
rpm -ivh /root/software/jdk-8u311-linux-x64.rpm 安装
java -version 查看
rpm -qa | grep jdk 查看
环境变量(路径为JDK 的解压路径)
vim /etc/profile
在最后一行配置
export JAVA_HOME=/usr/java/jdk1.8.0_311-amd64
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin
export ClASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
配置完成 //让配置生效
source /etc/profile 重启也可以 source是重新加载
查看配置结果
echo $JAVA_HOME
rpm包的卸载
rpm -e jdk1.8.0_311-amd64
java -version
部分基本命令
1.查询已安装的所有软件包
rpm -qa
2.查询软件包是否安装并查看软件包的版本
rpm -q <package_name>
rpm -q jdk1.8-1.8.0_311-fcs.x86_64
3.查询软件包信息
rpm -qi <package_name>
rpm -qlp <package_file_path_name>
rpm -qi jdk1.8-1.8.0_311-fcs.x86_64
5.查询磁盘上的文件是从何软件包安装的
rpm -qf <path_name>
rpm -qf /usr/java/jdk1.8.0_311-amd64
RPM校验
1.校验有已安装的所有软件包‘
rpm -Va
’验证内容中的8个信息的具体内容如下:
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否变改变
5 文件MD5校验和是否改变(可以看作文件内容是否改变)
D 装置的主/次代码已经改变
L Link路径已被改变
U 文件的所属人已被改变
G 文件的所属群组已被改变
T 文件的创建时间忆被改变
文件类型:
c 配置文件(config file)
d 普通文件(documentation)
g "鬼"文件(ghost file),很少发生,通常是指该文件不被软件包所包含
l 授权文件(license file)
r 描述文件(read me)
2.校验指定的软件包
rpm -V <package_name>
测试删除安装目录下任意文件,再次检查
改变任意文件的权限,再次检查
3.验证包含指定文件的软件包
rpm -Vf <path_name>
rpm -Vf /usr/java/jdk1.8.0_311-amd64
软件的安装和维护(yum)
1.概述
RPM软件包一般非为两大类:
- yy-x.x.rpm 软件包;
- yy-devel-x.x.rpm软件开发包,供别的软件包引用的库包。
由此,RPM软件包安装时经常会出现缺少依赖库的现象,有时会产生连锁反应。
yum就是为了解决软件依赖问题而生。它的原理是将所有的软件包和软件开发包都放到服务器上,当安装软件包时向服务器请求,由服务器分析出依赖关系,从而提供一整套安装包。
Yum(全称为 Yellow dog Updater, Modified)(黄狗)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
2. yum的功能介绍
1.安装——将软件从包中解出来,并安装到硬盘。
2.卸载——将软件从硬盘清除。
3.升级——替换软件的旧版本。
4.查询——查询软件包的信息。
3. yum源的配置文件
[root@localhost yum.repos.d]# vi /etc/yum.repos.d/CentOS-Base.repo
[base] 容器名称,一定要放在[]中
name 容器说明,可以自己随便写
mirrorlist 镜像站点,这个可以注释掉
baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的yum源地址
enabled 此容器是否生效,如果不写或写成enable=1都是生效,写成enable=0就是不生效
gpgcheck 如果是1是指RPM的数字证书生效,如果是0则不生效
gpgkey 数字证书的公钥文件保存位置。不用修改
4. yum源的配置
方法一: 配置本地yum源:
1.列出配置源
yum repolist
2.配置本地源
从CentOS的官网下载CentOS的完整版iso文件,并上传到Linux文件系统中,例如/opt/tools/CentOS-6.9-x86_64-bin-DVD1.iso
第二步:挂载这个iso文件到/media/CentOS
mkdir /media/vcdrom
mount -o loop /opt/tools/CentOS-6.9-x86_64-bin-DVD1.iso /media/vcdrom
安装时使用参数enablerepo=c6-media
yum --enablerepo=c6-media -y install mysql-server
方法二:配置阿里源
- 安装wget
yum install -y wget - 备份/etc/yum.repos.d/CentOS-Base.repo文件
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.back - 下载阿里云的Centos-6.repo文件
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo - 重新加载yum
yum clean all
yum makecache
yum的基本查询
1.查询jdk环境应该安装哪个具体的包名
yum search jdk
3.查询服务器上所有的已经安装和可以安装的程序包
yum list
yum list rpm
yum list jdk******
4.查询有哪些软件需要升级
yum list updates