【Linux系列教程】Shell脚本基础

一、Shell脚本的应用

  • 应用场景:
    • 重复的工作、自动执行
    • 本质上就是个文本文件

二、echo 输出

1.echo

Tips: 单引号双引号的区别:
单引号:所有字符会被作为普通字符显示
双引号:特殊字符会被转义

[root@localhost ~]# echo "kvm虚拟机管理工具"
kvm虚拟机管理工具
[root@localhost ~]# echo 'kvm虚拟机管理工具'
kvm虚拟机管理工具

2.-e解释转译字符

\n 换行
\t 空格

[root@localhost ~]# echo -e "SHELL\nPython\nGOlang"
SHELL
Python
GOlang
[root@localhost ~]# echo -e "Linux\tWindows\tUNIX"
Linux Windows	UNIX

3.here document 显示多行内容

[root@localhost ~]# cat << eof	#eof可替换其他字符
> 1. 创建虚拟机
> 2. 查看虚拟机
> 3. 销毁虚拟机
> 4. 查看系统资源
> eof	#上一个字符写什么,这里就以什么结束

三、重定向符号

1.重定向类型

输出重定向:
>、>>、2>、&>
输入重定向
<

2.三个基本设备文件

/dev/stdin 标准输入设备 键盘、鼠标 0
/dev/stdout 标准输出设备 显示器 1
/dev/stderr 标准错误输出设备 显示器 2

3.输出重定向

A.> 标准重定向信息

仅能输出正确信息,自动覆盖文件内容

[root@master ~]# cat /etc/fstab > /tmp/fstab.log
[root@master ~]# cat /tmp/fstab.log

#
# /etc/fstab
# Created by anaconda on Fri Mar 17 16:57:52 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e8a04612-968e-46cf-94bc-4b144bed2806 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sr0  /mnt iso9660  defaults	0 0

B. 2> 错误重定向信息

[root@master ~]# cat /etc/hgadhjfhja > /tmp/log
cat: /etc/hgadhjfhja: 没有那个文件或目录		#可以看到使用标准重定向并不能记录错误的信息
[root@master ~]# cat /tmp/log
[root@master ~]# 
[root@master ~]# cat /etc/hgadhjfhja 2> /tmp/log
[root@master ~]# cat /tmp/log
cat: /etc/hgadhjfhja: 没有那个文件或目录		#可以看到错误信息成功记录到了日志中

C. &> 重定向所有信息

[root@master ~]# cat /etc/hgadhjfhja &> /tmp/log	#成功记录
[root@master ~]# cat /etc/fstab &> /tmp/log		#成功记录
[root@master ~]# cat /tmp/log 	#查看日志,发现只有上一条记录,这就是>输出的时候,只能做覆盖操作

#
# /etc/fstab
# Created by anaconda on Fri Mar 17 16:57:52 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e8a04612-968e-46cf-94bc-4b144bed2806 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sr0  /mnt iso9660  defaults	0 0

D. >>追加

仅能输出正确信息,自动追加文件内容

[root@master ~]# cat /etc/shadow >> /tmp/log
[root@master ~]# cat /tmp/log 	#不仅上次记录的内容在,这次新记录的内容,同样存在

#
# /etc/fstab
# Created by anaconda on Fri Mar 17 16:57:52 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e8a04612-968e-46cf-94bc-4b144bed2806 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sr0  /mnt iso9660  defaults	0 0
root:$6$Ywz9VrM4JS.Iwke7$kU268DkKfzfdHDnC/RDQDViu5GTlkQvRG2Gb.BEEAI3TQ78vmCH5qwA6sVzCIj6JwQ8xaHIzRFCuTccjU5uxh/::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::

E.&>> 混合追加

不管正确信息还是错误信息,都能追加到文件内容

[root@master ~]# cat /etc/fstab &>> /tmp/log1
[root@master ~]# ls /ghjafhjfa &>> /tmp/log1
[root@master ~]# ls /root/ &>> /tmp/log1
[root@master ~]# cat /tmp/log1

#
# /etc/fstab
# Created by anaconda on Fri Mar 17 16:57:52 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e8a04612-968e-46cf-94bc-4b144bed2806 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sr0  /mnt iso9660  defaults	0 0
ls: 无法访问/ghjafhjfa: 没有那个文件或目录
1.sh
aa
aaa
anaconda-ks.cfg

F.黑洞文件/dev/null

输出信息指到这个文件后,内容都不会被保存下来

[root@localhost ~]# ls -ldh /etc/ > /dev/null 

4.输入重定向

使用文件的内容作为键盘输入使用

[root@localhost ~]# vim /tmp/file01
abcde

[root@localhost ~]# tr 'a-z' 'A-Z' < /tmp/file01
ABCDE

四、变量

1.变量类型

  • 自定义变量
  • 环境变量
  • 特殊变量

2.自定义变量

A.自定义变量的注意

变量名称=值

只能出现字母、数字、下划线
不能与shell关键字冲突
见名知义

B.调用变量

$变量名称
${变量名称}

C.自定义变量的使用

[root@localhost ~]# ip_address=10.1.1.1
[root@localhost ~]# echo "MySQL server is $ip_address"
MySQL server is 10.1.1.1
[root@localhost ~]# echo "MySQL server is ${ip_address}"
MySQL server is 10.1.1.1

D.自定义变量的中括号使用

[root@localhost ~]# data=server
[root@localhost ~]# echo "There are some $datas"
There are some 
[root@localhost ~]# echo "There are some ${data}s"
There are some servers

E.交互式变量

# read -p "提示信息" 变量名称
[root@localhost ~]# read -p "用户名: " name
用户名: userA
[root@localhost ~]# echo $name
userA

3.数学运算符

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • % 取余

A.Shell存储的变量都是字符

[root@localhost ~]# a=10
[root@localhost ~]# b=20
[root@localhost ~]# c=a+b
[root@localhost ~]# echo $c
a+b
[root@localhost ~]# c=$a+$b
[root@localhost ~]# echo $c
10+20

B.做数学运算$((表达式))

[root@localhost ~]# a=10
[root@localhost ~]# b=20
[root@localhost ~]# c=$((a+b))
[root@localhost ~]# echo $c
30

4.命令引用

  • `命令` 反引号
  • $(命令)
[root@localhost ~]# result_02=$(uptime)
[root@localhost ~]# echo $result_02
13:47:11 up 4:44, 1 user, load average: 0.00, 0.01, 0.05

[root@localhost ~]# result_01=`free -m`
[root@localhost ~]# echo $result_01
total used free shared buff/cache available Mem: 972 94 727 7 151 715 Swap: 2047 0 2047

五、系统环境变量

1.查看当前系统环境变量

[root@localhost ~]# env

2.定义、修改环境变量

针对系统所有用户,永久生效 /etc/profile
指针对某个特定用户,永久生效 /用户家目录/.bash_profile
环境变量名称必须大写

# export 环境变量=值

A.定义历史命令执行时间

export HISTTIMEFORMAT="%F_%T  "

B.定义最多记录历史命令个数(默认1000)

export HISTSIZE=20

C.修改系统语言

export LANG=en_US.UTF-8

3.特殊变量 $?

  • 上一条命令的执行状态码
  • 取值范围: 0—255
    • 0 成功
    • 非0 失败
[root@master ~]# ls -a /root
[root@master ~]# echo $?
0

[root@master ~]# ls -a /123456
ls: 无法访问/123456: 没有那个文件或目录
[root@master ~]# echo $?
2

六、awk命令

某行截取内容
awk默认使用空白字符分割每一行内容,分割出来的每一部分,分别使用$1, $2, $3…代表
-F 指定分割符

# head -n 3 /etc/passwd | tail -n 1 | awk -F: '{print $6}'
/sbin

[root@master ~]# ifconfig | grep "netmask" | awk '{print $2}'
10.10.10.128
127.0.0.1

七、几个简单的Shell脚本演示

编写完脚本之后,要使用chmod命令赋予执行权限
使用bash shell脚本存放目录执行脚本

1.创建用户hadoop,并为其设置密码为redhat

#!/bin/bash
useradd hadoop
echo "redhat" | passwd --stdin hadoop &> /dev/null
echo "用户hadoop创建完成"

2.交互式创建用户

#!/bin/bash
read -p "用户名: " name
read -p "密码: " password 
useradd $name
echo "$password" | passwd --stdin $name &> /dev/null
echo "用户$name创建完成"

3.配置本地Yum源

#! /bin/bash
echo "备份旧的Yum仓库"
mkdir -p /yum
mv /etc/yum.repos.d/* /yum
echo "挂载本地光盘镜像"
echo '/dev/sr0  /mnt iso9660  defaults  0 0' >> /etc/fstab
mount -a &> /dev/null
echo "创建本地Yum仓库"
cat << yum > /etc/yum.repos.d/centos7.repo
[Centos7]
name=centos
baseurl=file:///mnt
enabled=1
gpgcheck=0
yum
yum clean all &> /dev/null
yum repolist
echo "恭喜你,本地Yum仓库创建完成!"