linux----------(4)

本文详细介绍了Shell脚本的基础知识,包括脚本编写、执行、调试,以及变量、位置参数和常见状态命令的使用。通过实例展示了如何创建和调试脚本,处理文件操作,如复制和删除。同时,文章涵盖了RPM软件包管理,包括安装、卸载、查询和验证,以及YUM的配置和使用,解决依赖问题。内容深入浅出,适合Linux系统管理员和初学者学习。
摘要由CSDN通过智能技术生成

一、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.特殊变量

  1. 与命令行参数相关
    $* 将所有位置参量看成一个字符串(以空格间隔) 。String str= “1 2 3 4”
    $@ 将每个位置参量看成单独的字符串(以空格间隔)。

    “ $ ∗ ”将所有位置参量看成一个字符串(以 *” 将所有位置参量看成一个字符串(以 将所有位置参量看成一个字符串(以IFS间隔)。

    “$@” 将每个位置参量看成单独的字符串(以空格间隔) 。
    $0 命令行上输入的Shell程序名。
    $# 表示命令行上参数的个数。

  2. 进程相关
    $? 表示上一条命令执行后的返回值
    $$ 当前进程的进程号
    $! 显示运行在后台的最后一个作业的 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软件包一般非为两大类:

  1. yy-x.x.rpm 软件包;
  2. 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

方法二:配置阿里源

  1. 安装wget
    yum install -y wget
  2. 备份/etc/yum.repos.d/CentOS-Base.repo文件
    cd /etc/yum.repos.d/
    mv CentOS-Base.repo CentOS-Base.repo.back
  3. 下载阿里云的Centos-6.repo文件
    wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  4. 重新加载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

5. yum的安装、卸载与升级

6.软件组功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Network porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值