【系统运维】Shell脚本入门
本文介绍了Shell脚本的基础知识与应用。主要内容包括:Shell简介、快速入门方法、变量定义与使用(系统变量、自定义变量和特殊变量)、控制语句(条件判断和流程控制)、函数定义等核心内容。文章通过具体示例展示了Shell脚本的基本写法、执行方法和实用技巧,帮助初学者快速掌握Shell编程的基本技能。Shell脚本作为Linux/Unix系统的高效自动化工具,可广泛应用于系统管理、文件操作和数据处理
目录
前言
Shell 脚本是 Linux 和 Unix 系统中强大的自动化工具,能够将一系列命令组合成可执行的脚本,从而简化重复性任务,提高工作效率。无论是系统管理、文件操作,还是数据处理,Shell 脚本都能发挥重要作用。
本篇文章将从 Shell 的基本概念入手,逐步介绍 Shell 脚本的编写、执行方法、变量使用、流程控制以及函数定义等内容,帮助初学者快速了解 Shell 编程的核心技能。值得注意的是,本篇文章仅对 Shell 中重要的几个部分进行了一些梳理,并没有做过多深入的探讨。
一、Shell简介
Shell是人机交互的一个桥梁,其种类有很多,举个例子,我们在Liunx系统中输入如下命令查看Shell的种类:
[root@MissHou ~]# cat /etc/shells
/bin/sh #是bash的一个快捷方式
/bin/bash #bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin #表示非交互,不能登录操作系统
/bin/dash #小巧,高效,功能相比少一些
/bin/csh #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷
/bin/tcsh #是csh的增强版,完全兼容csh
那么,什么是Shell脚本呢?简单来说就是将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。对于一些重复化、复杂化的工作,我们可以编写Shell脚本来提高我们的工作效率。
二、快速入门
这一部分,我们来快速入门Shell脚本,需要关注两个点,分别是基本写法、执行方法。
1. 基本写法
- 脚本第一行,魔法字符
#!指定解释器(必写)。如#!/bin/bash表示以下内容使用bash解释器解析。 - 脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述(可选)。
- 脚本第三部分,脚本要实现的具体代码内容。
注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:
#!/bin/env 解释器#!/bin/env bash
基本写法示例:
#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: 名字
# Desc:描述describe
# Path:存放路径
# Usage:用法
# Update:更新时间
#下面就是脚本的具体内容
commands
...
2. 执行方法
执行方法可以分为标注执行方法和非标准执行方法,下面是标准执行方法的一个示例:
1) 编写人生第一个shell脚本
[root@MissHou shell01]# cat first_shell.sh
#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: first_shell.sh
# Desc: num1
# Path: /shell01/first_shell.sh
# Usage:/shell01/first_shell.sh
# Update:2019-05-05
echo "hello world"
echo "hello world"
echo "hello world"
2) 脚本增加可执行权限
[root@MissHou shell01]# chmod +x first_shell.sh
3) 标准方式执行脚本
[root@MissHou shell01]# pwd
/shell01
[root@MissHou shell01]# /shell01/first_shell.sh
或者
[root@MissHou shell01]# ./first_shell.sh
注意:标准执行方式脚本必须要有可执行权限。
下面是两个非标准的执行方法示例:
1) 编写人生第一个shell脚本
[root@MissHou shell01]# cat first_shell.sh
#!/bin/env bash
# 以下内容是对脚本的基本信息的描述
# Name: first_shell.sh
# Desc: num1
# Path: /shell01/first_shell.sh
# Usage:/shell01/first_shell.sh
# Update:2019-05-05
echo "hello world"
echo "hello world"
echo "hello world"
2) 脚本增加可执行权限
[root@MissHou shell01]# chmod +x first_shell.sh
3) 标准方式执行脚本
[root@MissHou shell01]# pwd
/shell01
[root@MissHou shell01]# /shell01/first_shell.sh
或者
[root@MissHou shell01]# ./first_shell.sh
注意:标准执行方式脚本必须要有可执行权限。
[root@MissHou shell01]# source first_shell.sh
hello world
hello world
hello world
三、Shell变量
变量用于存储管理临时的数据,这些数据都是在运行内存中的。变量分为系统环境变量、自定义变量和特殊符号变量。
1. 系统环境变量
1.1 查看环境变量
系统环境变量是系统提供的共享变量,时Liunx系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用。Shell的配置文件分类如下:
- 全局配置文件
- /etc/profile
- /etc/profile.d/*.sh
- /etc/bashrc
- 个人配置文件
- 当前用户/.bash_profile
- 当前用户/.bashrc
一般情况下,我们都是直接针对全局配置进行操作。在Liunx系统中,环境变量按照其作用范围不同大致可以分为系统环境变量和用户环境变量。
查看当前系统环境变量的命令:
env
查看Shell变量的命令(系统环境变量+自定义变量+函数):
set
常用的系统环境变量如下图所示:

1.2 创建环境变量
export key1=var1
source /etc/profile
1.3 工作环境分类

环境变量初始化加载过程(分登录环境和非登录环境):

识别登录环境和非登录环境的方法:
使用
$0获取当前Shell环境的类型,bash代表Shell非登录环境,-bash代表Shell登录环境。
2. 自定义变量
2.1 自定义局部变量
变量定义语法:
var_name=value
变量定义的规则:
- 变量名称可以有字幕,数字和下划线组成,但是不能以数字开头。
- 等号两侧不能有空格。
- 在bash环境中,变量的默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,必须使用双引号括起来。
- 不能使用Shell的关键字作为变量名称。
查询变量值的语法:
# 语法1:直接使用变量名查询
$var_name
# 语法2:使用花括号
${var_name}
# 区别:花括号方式适合拼接字符串
删除变量的语法:
unset var_name
2.2 自定义常量
自定义常量的语法:
readonly var_name
2.3 自定义全局变量
这个全局变量可以在当前Shell环境与子Shell环境中都可以使用。
自定义全局变量的语法:
export var_name1 var_name2
3. 特殊变量
|
特殊变量语法 |
含义 |
|
$n |
用于接收脚本文件执行时传入的参数 $0 用于获取当前脚本文件名称。 $1~9,代表获取第1个输入参数到第9个参数的。 第10个参数以上获取参数的格式:${数字},否则无法获取。 |
|
$# |
获取所有输入参数的个数 |
|
$* |
含义都是获取所有输入变量,用于以后输出所有参数。 区别:
"$*"获取的所有参数拼接成一个字符串,格式为:"$1 $2 ... $n"; "$@"获取一组参数列表,格式为:"$1" "$2" ... "$n"。 使用循环打印所有输入参数可以看出区别。 |
|
$@ |
|
|
$? |
用于获取上一个Shell命令的推出状态码,或者是函数的返回值。 |
|
$$ |
用于获取当前Shell环境的进程ID号。 |
四、控制语句
1. 条件判断语句
1.1 语法格式
条件判断的语法格式如下:
- 格式一:test 条件表达式
- 格式二:[ 条件表达式 ]
- 格式三:[[ 条件表达式 ]] 支持正则 =~
1.2 条件判断参数
1.2.1 判断文件类型
|
判断参数 |
含义 |
说明 |
|
-e |
判断文件是否存在(link文件指向的也必须存在) |
exists |
|
-f |
判断文件是否存在并且是一个普通文件 |
file |
|
-d |
判断文件是否存在并且是一个目录 |
directory |
|
-L |
判断文件是否存在并且是一个软连接文件 |
soft link |
|
-b |
判断文件是否存在并且是一个块设备文件 |
block |
|
-S |
判断文件是否存在并且是一个套接字文件 |
socket |
|
-c |
判断文件是否存在并且是一个字符设备文件 |
char |
|
-p |
判断文件是否存在并且是一个命名管道文件 |
pipe |
|
-s |
判断文件是否存在并且是一个非空文件(有内容) |
is not empty |
1.2.2 判断文件权限
|
判断参数 |
含义 |
|
-r |
当前用户对其是否可读 |
|
-w |
当前用户对其是否可写 |
|
-x |
当前用户对其是否可执行 |
|
-u |
是否有suid,高级权限冒险位 |
|
-g |
是否sgid,高级权限强制位 |
|
-k |
是否有t位,高级权限粘滞位 (创建者/root才能删除) |
1.2.3 判断文件新旧
|
判断参数 |
含义 |
|
file1 -nt file2 |
比较file1是否比file2新 |
|
file1 -ot file2 |
比较file1是否比file2旧 |
|
file1 -ef file2 |
比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode |
1.2.4 判断整数
|
判断参数 |
含义 |
|
-eq == |
相等 |
|
-ne <> != |
不等 |
|
-gt |
大于 |
|
-lt |
小于 |
|
-ge |
大于等于 |
|
-le |
小于等于 |
1.2.5 判断字符串
|
判断参数 |
含义 |
|
-z |
判断是否为空字符串,字符串长度为0则成立 |
|
-n |
判断是否为非空字符串,字符串长度不为0则成立 |
|
string1 = string2 |
判断字符串是否相等 |
|
string1 != string2 |
判断字符串是否相不等 |
1.2.6 多重条件判断
|
判断符号 |
含义 |
举例 |
|
-a 和 && |
逻辑与 |
[ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ] |
|
-o 和 || |
逻辑或 |
[ 1 -eq 1 -o 1 -ne 1 ] |
1.3 流程控制语句
if [ condition ];then
command
command
fi
if test 条件;then
命令
fi
if [[ 条件 ]];then
命令
fi
[ 条件 ] && command
if [ condition ];then
command1
else
command2
fi
[ 条件 ] && command1 || command2
if [ condition1 ];then
command1 结束
elif [ condition2 ];then
command2 结束
else
command3
fi
注释:
如果条件1满足,执行命令1后结束;如果条件1不满足,再看条件2,如果条件2满足执行命令2后结束;如果条件1和条件2都不满足执行命令3结束.
2. for循环语句
2.1 列表循环
for variable in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
2.2 不带列表循环
不带列表的for循环执行时右用户指定参数和参数的个数,基本语法格式如下:
for variable
do
command
command
…
done
2.3 类C风格的for循环
for(( expr1;expr2;expr3 ))
do
command
command
…
done
for (( i=1;i<=5;i++))
do
echo $i
done
expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出
五、Shell函数
1. 基本概念
Shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为Shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。
2. 定义函数的基本语法
方法1:
函数名()
{
函数体(一堆命令的集合,来实现某个功能)
}
方法2:
function 函数名()
{
函数体(一堆命令的集合,来实现某个功能)
echo hello
echo world
}
函数中return说明:
- return可以结束一个函数。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。
- return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。
- 如果没有return命令,函数将返回最后一个指令的退出状态值。
总结
掌握 Shell 脚本的关键在于实践,通过不断练习,可以灵活运用变量、条件分支、循环和函数,编写出更强大的自动化脚本。无论是文件处理、系统监控,还是批量任务,Shell 脚本都能提供简洁而高效的解决方案。路漫漫其修远兮,吾将上下而求索!

更多推荐




所有评论(0)