AUTHOR:闫小雨
TIME:2024-05-08
目录
一、shell基础
1、为什么用 Shell 脚本
用来解决服务器自动化运维,减轻管理员的工作量,解决大量的重复性的输入和交互式操作问题。
2、用户的登录 Shell
- Shell:一个特殊的应用程序,位于用户和操作系统内核之间,用来把用户输入的命令解释给系统内核去执行,并输出执行结果 (解释器)
- 查看 Linux 系统所支持的 Shell 脚本种类:
cat /etc/shells
[root@yanxy502 ~]# cat /etc/shells
/bin/sh
/bin/bash # /bin/bash 是大多数 Linux 用户系统的默认 Shell
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
1、编写第一个shell脚本
1)基本格式
[root@yanxy502 ~]# vim shell.sh # 前面的 shell 可以随意. 后缀必须为 .sh
#!/bin/bash # 脚本声明
#这是一个简单的Shell脚本 # 注释
cd /mnt # 脚本要执行的命令
echo "当前目录位于:"
pwd
2)执行脚本
./
方式必须加可执行权限。
[root@yanxy502 ~]# chmod 755 shell.sh
[root@yanxy502 ~]# ./shell.sh
sh
方式不需要加执行权限。
[root@yanxy502 ~]# sh shell.sh
二、重定向与管道操作
1、重定向操作
1)重定向输入
<
:从指定的文件读取数据,而不是从键盘输入。
[root@yanxy502~]# vim passwd.txt
ABC123$
[root@yaxny502 ~]# useradd yanxiaoyu
[root@yanxy502 ~]# passwd --stdin yanxiaoyu < passwd.txt
更改用户 yanxiaoyu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
2)重定向输出
>
:将输出结果保存到指定的文件(覆盖原文件)。
[root@yanxy502 ~]# uname -p > a.txt
[root@yanxy502 ~]# cat a.txt
x86_64
>>
:将输出结果追加到指定的文件。
[root@yanxy502 ~]# uname -r >> a.txt
[root@yanxy502 ~]# cat a.txt
x86_64
3.10.0-1062.el7.x86_64 #这是追加进来的
3)错误重定向输出
2>
:将错误信息保存到指定的文件(覆盖原文件)。
[root@yanxy502 ~]# tar jcf /nonedir/etc.tgz /etc/ 2> error.log
[root@yanxy502 ~]# cat error.log
tar: 从成员名中删除开头的“/”
tar (child): /nonedir/etc.tgz:无法 open: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
2>>
:将错误信息追加到指定的文件中。
[root@yanxy502 Test]# cdd 2>> error.log
[root@yanxy502 Test]# cat error.log
tar: 从成员名中删除开头的“/”
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
bash: cdd: 未找到命令
4)混合输出
&>
:表示直接把正确的输出和错误的输出都直接保存到后面的文件中,后面文件的原始数据丢失。
[root@yanxy502 ~]# pwd &> a.sh
[root@yanxy502 ~]# cat a.sh
/home/Test
&>>
:表示直接把正确的输出和错误的输出都直接追加到后面的文件中,原始文件数据保留。
[root@yanxy502 ~]# pwdd &>> a.sh
[root@yanxy502 ~]# cat a.sh
/root
bash: pwdd: 未找到命令...
2、管道符操作
|
管道符:将管道符号 |
左侧命令的操作结果,作为右侧命令的执行对象。(同一行命令中可以使用多个)
[root@yanxy502 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
yanxiaoyu:x:1000:1000::/home/yanxiaoyu:/bin/bash
[root@yanxy502 ~]# grep "/bin/bash$" /etc/passwd | wc -l
2
三、使用 Shell 变量
Shell 变量是用来存放系统和用户需要使用的特定参数,这些特定参数会根据用户的设定或环境的变化而变化,Shell 变量的使用能够提供更强的适应性与功能。
1、自定义变量
- 由系统用户自己去定义,只在用户自己的 Shell 环境中有效,又称为本地变量。
- 基本格式:变量名=变量值(其中
=
是赋值符号,=
两边不能有空格,变量名需要以字母或者下划线开头,不能包含特殊字符)
[root@yanxy502 ~]# name=yanxy #定义变量name,并赋值为yanxy
[root@yanxy502 ~]# age=21 #定义变量age,并赋值为21
[root@yanxy502 ~]# echo $name #查看变量name
zhangsan
[root@yanxy502 ~]# echo $value #查看变量value,因为没有定义value,所以结果为空
[root@yanxy502 ~]# echo $name age #每一个不同变量,都需要再前面加上一个"$"符号
yanxy age
[root@yanxy502 ~]# echo $name $age #查看变量name与变量age
yanxy 21
2.变量赋值的特殊操作
1)双引号的使用场合
- a:当赋值内容中包含空格时必须使用双引号。
[root@localhost ~]# PYTHON=Java 18.9.9.9 #错误赋值
bash: 2.7.14: 未找到命令...
[root@localhost ~]# PYTHON="Java 18.9.9.9" #正确赋值
[root@localhost ~]# echo $PYTHON
Java 18.9.9.9
- b:当赋值内容中用 $ 引用了其它变量时,必须要使用双引号。
[root@yanxy502 ~]# aaa="ni hao" #赋值 aaa 值
[root@yanxy502 ~]# echo $aaa
ni hao
[root@yanxy502 ~]# bbb="$aaa ma" #将 aaa 值赋予给 bbb
[root@yanxy502 ~]# echo $bbb
ni hao ma
2)单引号的使用场合
- 当赋值内容中包含 $ 、双引号、\ 等含有特殊的字符时,需要使用单引号扩起来。
[root@yanxy502 ~]# aaa='ni hao $b' #单引号不会引用其他变量
[root@yanxy502 ~]# echo $aaa
ni hao $b
3)反撇号的使用
- 用于命令的替换或者是命令的赋值;把某个命令的执行结果赋值给变量。
[root@yanxy502 ~]# shijian=`date` #把 date 这个命令的执行结果赋值给 shijian
[root@yanxy502 ~]# echo $shijian #查询
2024年 05月 08日 星期五 17:29:28 CST #返回的时间
4)read 命令
- 用来提示用户从键盘读入数据,赋值给变量。从而实现简单的交互过程。(类似于Java中Scaneer)
[root@yanxy502 ~]# read aaa #普通赋值
ni hao wo shi yanxiaoyu
[root@yanxy502 ~]# echo $aaa
ni hao wo shi yanxiaoyu
[root@yanxy502 ~]# read -p "你是谁" bbb #设置提示信息,以便告知用户输入说明内容 (使交互操作更加友好,提高易用性)
你是谁 我是闫小雨
[root@yanxy502 ~]# echo $bbb
我是闫小雨
5)变量的使用范围
- 局部变量:只在当前 Shell 环境中有效。
- 全局变量:在所有 Shell 环境中有效。==>
export
[root@localhost ~]# boss=aaa #定义局部变量
[root@localhost ~]# export boss #把局部变量转化为全局变量
[root@localhost ~]# echo $boss
aaa
[root@localhost ~]# bash #进入子Shell
[root@localhost ~]# echo $boss #再次进行查看,可以正常显示
aaa
[root@localhost ~]# export aaa=yanxiaoyu #直接将变量设置全局变量
[root@localhost ~]# echo $aaa
yanxiaoyu
6)变量的运算:expr
加法运算 |
|
减法运算 |
|
乘法运算 |
|
除法运算 |
|
求模运算(取余运算) |
|
[root@yanxy502 ~]# X=100
[root@yanxy502 ~]# echo $X
100
[root@yanxy502 ~]# Y=20
[root@yanxy502 ~]# echo $Y
20
[root@yanxy502 ~]# expr $X - $Y #减法运算: -
80
[root@yanxy502 ~]# expr $X \* $Y #乘法运算: \*
2000
[root@yanxy502 ~]# expr $X / $Y #除法运算: /
5
[root@yanxy502 ~]# expr $X % $Y #求模(取余)运算: %
0
四、特殊的 Shell 变量
1.环境变量
- 由系统提前创建,用来设置用户的工作环境。
配置文件: /etc/profile ~/.bash_profile
[root@yanxy502 ~]# env #查看当前环境变量
常见的环境变量:
USER
:表示用户名称。HOME
:表示用户的宿主目录。LANG
:表示语言的字符集。PWD
:表示当前所在工作目录。PATH
:表示命令搜索路径。
[root@yanxy502 ~]# echo $HOSTNAME = hostname #查看主机名
[root@yanxy502 ~]# echo $PWD = pwd #查看当前的工作目录
[root@yanxy502 ~]# echo $LANG #查看语言个字符集
[root@yanxy502 ~]# echo $PATH #查看默认的搜索路径
改变环境变量:
- 临时更改: 给搜索路径中添加 /root 执行
PATH="$PATH:/root"
会立即生效,重启后失效。
[root@yanxy502 ~]# ll aaa.sh #查看脚本文件的位置
-rwxr-xr-x 1 root root 30 5月 8 18:54 aaa.sh
[root@yanxy502 ~]# chmod +x aaa.sh #赋予aaa.sh可执行权限
[root@yanxy502 ~]# PATH="$PATH:/root" #立即生效,重启后消失
[root@yanxy502 ~]# aaa.sh #可以直接以文件名运行脚本
当前目录位于
/root
- 永久更改: 给搜索路径中永久添加 root: 执行。
[root@yanxy502 ~]# echo PATH="$PATH:/root" >> /etc/profile #把搜索路径添加到环境变量的主配置文件
[root@yanxy502 ~]# . /etc/profile #立即执行脚本,让环境变量立即生效
2.位置变量
使用 Shell 脚本程序时,方便通过目录行为程序提供操作参数(也叫位置参数;使用$1、$2、… $9 表示;$1 表示脚本或命令后的第一个位置,然后依次类推)
[root@yanxy502 ~]# vim qh.sh
#!/bin/bash
SUM=`expr $1 + $2` #定义变量SUM,SUM的值是位置变量 1 和位置变量 2 的和
echo "$1 + $2 = $SUM" #返回值的含义就是 $1 + $2 = $1 + $2
[root@yanxy502 ~]# chmod +x qh.sh #赋予脚本可执行权限
[root@yanxy502 ~]# ./qh.sh 100 11 #100就是$1;11就是$2
100 + 11 = 111 #返回的结果
- 注意:如果当位置变量超过 $9,即 $10,$11 … 时,则需要使用 { } 来括起来。如:
${11}
3.预定义变量
- 由
bash
程序预先定义好的一类特殊变量,用户只能使用,不能创建和修改预定义变量。
预定义变量:
| 命令行中位置变量的个数。 |
| 所有位置变量的内容。(在 for 循环中如果 $* 用 " " 括起来的情况下,则会把位置变量视为整体来输出。如:$1 $2 … $n 的形式输出所有参数) |
| 所有位置变量的内容。(在 for 循环中如果 $@ 用 " " 括起来的情况下,则会把位置视为个体来输出。如:$1、$2、… $n 的形式输出所有参数) |
| 当前执行的进程/程序名。 |
| Shell 脚本本身的 PID 号(ProcessID,即脚本运行的当前进程 ID 号) |
| 后台运行的最后一个进程的 PID 号。 |
| 上一条命令执行后返回的状态,当返回状态值为 0 时表示执行正常,非 0 值表示执行异常或出错。 |