【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仓库创建完成!"