Shell脚本简介
Shell脚本是Linux系统中一种非常重要的自动化工具,它允许用户通过编写脚本来执行一系列命令,从而简化重复性工作。以下是对Shell脚本学习的详细归纳:
Shell脚本基础
-
Shell脚本定义:Shell脚本是一种用Shell语言编写的程序,Shell语言是一种命令解释型语言,它接收用户输入的命令并解释执行。
-
Shell脚本的编写规范:
- 脚本的第一行通常是
#!/bin/bash
,用来指定脚本使用的Shell解释器。 - 脚本文件名通常以
.sh
为后缀,表示这是一个Shell脚本文件。 - 脚本中的命令需要按照执行的顺序一行一行地编写。
- 脚本的第一行通常是
-
Shell脚本的执行:
- 可以通过给脚本文件增加执行权限后直接执行,例如
chmod u+x script.sh
,然后./script.sh
。 - 也可以通过Bash调用执行脚本,例如
bash script.sh
。
- 可以通过给脚本文件增加执行权限后直接执行,例如
Shell脚本的基本语法
-
变量:
- 变量命名只能使用英文字母、数字和下划线,首个字符不能以数字开头。
- 等号左右两侧不能有空格。
- 可以使用单引号或双引号来包含变量的值,但双引号能够识别变量和转义字符,而单引号则不能。
-
输入输出重定向:
- 标准输出重定向:使用
>
将命令的输出重定向到文件中,如果文件已存在则覆盖,使用>>
则追加到文件末尾。 - 标准错误输出重定向:使用
2>
将命令的错误输出重定向到文件中。 - 同时重定向标准输出和标准错误输出:使用
&>
或2>&1
。
- 标准输出重定向:使用
-
条件判断:
- 使用
if
语句进行条件判断,if
后面跟条件表达式,then
后面跟要执行的命令序列,else
后面跟不满足条件时要执行的命令序列(可选),最后以fi
结束。 - 条件表达式可以是字符串比较、整数值比较或文件状态判断等。
- 使用
-
循环:
for
循环:用于遍历一个列表或范围。while
循环:当条件为真时重复执行命令序列。until
循环:与while
循环相反,当条件为假时重复执行命令序列。
-
函数:
- 使用
function
关键字或函数名()
来定义函数。 - 函数体内可以包含多条命令。
- 调用函数时只需写出函数名并加上括号(可选)。
- 使用
Shell脚本的常用命令
-
文本处理命令:
grep
:用于搜索文本中的匹配模式。awk
:用于处理和分析文本数据。sed
:用于对文本进行流编辑(如插入、删除、替换等)。
-
文件处理命令:
ls
:列出目录内容。cp
:复制文件或目录。mv
:移动或重命名文件或目录。rm
:删除文件或目录。
-
系统信息命令:
uname
:显示系统信息。top
:实时显示系统资源使用情况。free
:显示内存使用情况。df
:显示磁盘使用情况。
-
网络命令:
ping
:测试网络连通性。ifconfig
:显示或配置网络接口(已被ip
命令取代)。netstat
:显示网络连接、路由表等网络相关信息(已被ss
命令取代)。
Shell脚本的实例
- 获取主机信息:
#!/bin/bash
localip=$(ifconfig ens33 | grep netmask | tr -s " " | cut -d " " -f3)
mem=$(free | grep Mem | tr -s " " | cut -d " " -f7)
cpu=$(uptime | tr -s " " | cut -d " " -f11)
echo "IP address: $localip"
echo "Memory surplus: $mem"
echo "CPU load: $cpu"
这个脚本用于获取主机的IP地址、内存剩余量和CPU负载。
- 监控服务状态:
#!/bin/bash
if [ -z "$1" ]; then
echo "error: No server"
echo "Usage: script + server"
exit
fi
if systemctl is-active "$1" &>/dev/null; then
echo "$1 is started"
else
echo "$1 is not started"
fi
if systemctl is-enabled "$1" &>/dev/null; then
echo "$1 Is the boot auto option"
else
echo "$1 Not start auto option"
fi
这个脚本用于监控指定服务的状态,并检查它是否已设置为开机自启动。
- 分区管理:
#!/bin/bash
if [ $# -ne 2 ]; then
echo -e "usage: <disk name> <create|new|remove|query>"
exit
fi
if [ ! -b "$1" ]; then
echo -e "disk nonentity"
exit
fi
if [[ "$2" == create ]]; then
parted -s "$1" mklabel gpt
elif [[ "$2" == new ]]; then
parted -s "$1" mkpart primary 1 100%
elif [[ "$2" == remove ]]; then
parted -s "$1" rm 1
elif [[ "$2" == query ]]; then
parted -s "$1" print
else
clear
echo -e "operation error"
echo "use: [create|new|remove|query]."
fi
这个脚本用于管理磁盘分区,支持创建GPT标签、新建分区、删除分区和查询分区信息。
学习建议
- 多动手实践:编写自己的Shell脚本,通过实践来加深理解。
- 阅读官方文档:Linux系统的官方文档通常包含了Shell脚本的详细语法和命令说明。
- 参考在线资源:如CSDN博客、博客园等网站上有大量的Shell脚本学习教程和实例。
- 加入社区交流:可以加入Linux社区或Shell脚本学习群,与其他学习者交流心得和经验。
下一步计划
2025年开始,为了加强自己对shell的理解,会在博客同步开一个专题,用于介绍shell的语法和常用的指令,虽然内容均来自网络,但不耽误我们站在巨人的肩膀上看世界!
THE END