shell脚本入门(1)
Shell脚本文件编写规范
脚本文件后缀名规范
shell脚本文件就是一个文本文件, 后缀名建议使用 .sh
结尾
首行格式规范
首行需要设置Shell解析器的类型, 语法
#!/bin/bash
含义: 设置当前shell脚本文件采用bash解析器运行脚本代码
注释格式
单行注释, 语法
# 注释内容
多行注释, 语法
:<<!
# 注释内容1
# 注释内容2
!
脚本文件的常用执行3种方式
介绍
-
sh解析器执行方式
语法:
sh 脚本文件
介绍: 就是利用sh命令执行脚本文件, 本质就是使用Shell解析器运行脚本文件
-
bash解析器执行方式
语法:
bash 脚本文件
介绍: 就是利用bash命令执行脚本文件, 本质就是使用Shell解析器运行脚本文件
-
仅路径执行方式
语法:
./脚本文件
介绍: 执行当前目录下的脚本文件
注意: 脚本文件自己执行需要具有可执行权限, 否则无法执行
3种方式的区别
sh或bash执行脚本文件方式是直接使用Shell解析器运行脚本文件, 不需要可执行权限
仅路径方式是执行脚本文件自己, 需要可执行权限
Shell变量
Shell变量的介绍
变量用于存储管理临时的数据, 这些数据都是在运行内存中的.
变量类型
- 系统环境变量
- 自定义变量
- 特殊符号变量
系统环境变量
介绍
是系统提供的共享变量.是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用
环境变量分类
在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量。
系统级环境变量:Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用, 全局共享
用户级环境变量:Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用, 登录用户使用
查看当前Shell系统环境变量
查看命令
env
查看Shell变量(系统环境变量+自定义变量+函数)
命令
set
常用系统环境变量
变量名称 | 含义 |
---|---|
PATH | 与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割 |
HOME | 当前用户主目录:/root |
SHELL | 当前shell解析器类型:/bin/bash |
HISTFILE | 显示当前用户执行命令的历史列表文件:/root/.bash_history |
PWD | 显示当前所在路径:/root |
OLDPWD | 显示之前的路径 |
HOSTNAME | 显示当前主机名:itheima |
HOSTTYPE | 显示主机的架构,是i386、i686、还是x86、x64等:x86_64 |
LANG | 设置当前系统语言环境:zh_CN.UTF-8 |
自定义变量
分类
- 自定义局部变量
- 自定义常量
- 自定义全局变量
自定义局部变量
就是定义在一个脚本文件中的变量, 只能在这个脚本文件中使用的变量, 就是局部变量
语法
var_name=value
变量定义规则
- 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
- 等号两侧不能有空格
- 在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
- 变量的值如果有空格, 必须使用双引号括起来
- 不能使用Shell的关键字作为变量名称查询变量值语法
查询变量值语法
# 语法1: 直接使用变量名查询
$var_name
# 语法2: 使用花括号
${var_name}
# 区别: 花括号方式适合拼接字符串
变量删除语法
unset var_name
自定义常量
就是变量设置值以后不可以修改的变量叫常量, 也叫只读变量
语法
readonly var_name
自定义全局变量
父子Shell环境介绍
例如: 有2个Shell脚本文件 A.sh 和 B.sh
如果 在A.sh脚本文件中执行了B.sh脚本文件, 那么A.sh就是父Shell环境, B.sh就是子Shell环境
(就是在当前脚本文件中定义全局变量, 这个全局变量可以在当前Shell环境与子Shell环境中都可以使用)
自定义全局变量语法
export var_name1 var_name2
全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用
特殊变量
特殊变量:$n
语法:
$n
含义
用于接收脚本文件执行时传入的参数
$0 用于获取当前脚本文件名称的
$1~$9, 代表获取第一输入参数到第9个输入参数
第10个以上的输入参数获取参数的格式: ${数字}, 否则无法获取
执行脚本文件传入参数语法
sh 脚本文件 输入参数1 输入参数2 ...
特殊变量:$#
语法
$#
含义
获取所有输入参数的个数
特殊变量:$*
、$@
语法
$*
$@
# 含义都是获取所有输入参数, 用于以后输出所有参数
$*
与$@
区别
1.不使用双引号括起来, 功能一样
$*和$@获取所有输入参数,格式为: $1 $2 ... $n
2.使用双引号括起来
"$*"获取的所有参数拼接为一个字符串, 格式为: "$1 $2 ... $n"
"$@"获取一组参数列表对象, 格式为: "$1" "$2" ... "$n"
使用循环打印所有输入参数可以看出区别
循环语法
for var in 列表变量
do # 循环开始
命令 # 循环体
done # 循环结束
演示
-
编辑demo4.sh文件
-
直接输出所有输入参数, 与循环方式输出所有输入参数(使用双引号包含
$*
与$@
)#!/bin/bash # 命令1: 打印当前脚本文件名字 echo "当前脚本文件名称:$0" # 命令2: 打印第1个输入参数 echo "第一个输入参数:$1" # 命令3: 打印第2个输入参数 echo "第二个输入参数:$2" # 命令4: 打印第10个输入参数 echo "第十个输入参数不带花括号获取:$10" echo "第十个输入参数带花括号获取:${10}" # 命令5 打印所有输入参数的个数 echo "所有输入参数个数:${#}" # 增加命令: 实现直接输出所有输入后参数 echo '使用$*直接输出:'$* echo '使用$@直接输出:'$@ # 增加命令: 使用循环打印输出所有输入参数 echo '循环遍历输出$*所有参数' for item in "$*" do echo $item done echo '循环遍历输出$@所有参数' for item in "$@" do echo $item done
特殊变量:$?
语法
$?
含义
用于获取上一个Shell命令的退出状态码, 或者是函数的返回值
每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
一般来说, 返回0代表命令执行成功, 非0代表执行失败
特殊变量:$$
语法
$$
含义
用于获取当前Shell环境的进程ID号
演示
查看当前Shell环境进程编号
ps -aux|grep bash
输出 $$ 显示当前shell环境进程编号
Shell环境变量深入
自定义系统环境变量
全局配置文件/etc/profile应用场景
当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量, 供给所有Shell程序使用
以后只要是所有Shell程序或命令使用的变量, 就可以定义在这个文件中
案例演示
需求
/etc/profile定义存储自定义系统级环境变量数据
创建环境变量步骤
-
编辑/etc/profile全局配置文件
# 增加命令: 定义变量VAR1=VAR1 并导出为环境变量 # 扩展: vim里面的命令模式使用G快速定位到文件末尾位置, 使用gg定位到文件首行位置
-
重载配置文件/etc/profile, 因为配置文件修改后要立刻加载里面的数据就需要重载, 语法
source /etc/profile
-
在Shell环境中读取系统级环境变量VAR1
创建环境变量演示
编辑/etc/profile文件
vim /etc/profile
添加设置变量VAR1=VAR1并导出成为环境变量, 在/etc/profile文件末尾添加如下命令
# 创建环境变量
VAR1=VAR1
export VAR1
3、保存/etc/profile退出
4、重新加载/etc/profile文件数据更新系统环境变量
source /etc/profile
注意:如果这一步不执行,无法读取更新的环境变量
3、输出环境变量VAR1
echo $VAR1
Shell工作环境介绍
用户登录系统时,Shell为用户定义了工作环境,工作环境提供了共享数据环境变量,比如shell解析器类型、主机名等,这些数据存储在环境变量中,便于shell脚本程序操作使用;
shell工作环境分类
交互式与非交互式shell
交互式Shell
是shell的一种运行模式,交互式shell等待你输入命令,并且立即执行,然后将结果反馈给你。这是每个CLI用户都非常熟悉的流程:登录、执行一些命令、登出。当你登出后,这个shell就终止了。
非交互式Shell
是shell的另一种运行模式,它专门被用来执行预先设定的命令。在这种模式下,shell不与用户进行交互,而是读取存放在脚本文件中的命令并执行它们。当它读到文件的结尾,这个shell就终止了。
登录Shell与非登录Shell环境
类型名称 | 含义 |
---|---|
shell登录环境 | 需要用户名、密码登录之后才能进入的shell |
shell非登录环境 | 直接不用输入用户名和密码就可以打开的shell 或调用子Shell时使用的工作环境 |
注意:不同的工作环境加载环境变量流程不一样
识别Shell环境类型
识别shell环境的命令1
命令
使用$0识别环境语法
echo $0
输出
-bash
代表:shell登录环境输出
bash
代表: shell非登录环境注意:这个
$0
环境变量如果用在子shell中(shell脚本文件)输出Shell脚本本身的文件名
bash命令语法
bash
bash命令:用于切换为Shell非登录环境
分析
1、直接登录系统为shell登录环境输出 $0 观察输出信息效果
2、使用 bash 命令切换为shell非登录环境输出 $0 观察输出信息效果
3、创建test.sh脚本文件,编辑添加输出 $0 ,编程保存完成后执行test.sh脚本文件观察输出信息效果
识别shell环境的命令2
命令
logout命令语法
logout
logout命令: 用于退出Shell登录环境
exit命令语法
exit
exit命令: 用于退出Shell登录或非登录环境
区别
logout
只能退出Shell登录环境
exit
可以退出Shell登录与非登录环境
分析
1、进入Shell登录环境,使用logout正常登出
2、使用bash进入Shell非登录环境,使用logout不能正常登录
3、使用exit正常退出Shell非登录环境
详细切换Shell环境
切换shell环境命令介绍
-
直接登录加载shell登录环境
-
su切换用户加载Shell登录与Shell非登录环境
-
bash加载Shell登录与Shell非登录环境
切换Shell环境命令演示
切换环境方式1:直接登录系统
介绍
直接在虚拟机上使用用户名与密码登录linux系统或使用客户端直接连接远程linux系统
切换环境方式2:su切换用户登录
命令
语法1
su 用户名 --login
或
su 用户名 -l
# 切换到指定用户, 加载Shell登录环境变量
语法2
su 用户名
# 切换到指定用户, 加Shell非登录环境变量
分析步骤
1、创建普通用户userA
2、切换到用户userA,使用-l加载Shell登录环境变量 , 输出环境变量$0,观察输出-bash
4、使用exit退出userA
5、切换到用户userA,加载Shell非登录环境变量,输出环境变量$0,观察输出bash
切换环境方式3:bash切换
命令
语法1:
bash # 加载【Shell非登录环境】
语法2:
bash -l Shell脚本文件 / bash --login shell脚本文件
sh -l shell脚本文件 / sh --login shell脚本文件
# 先加载【Shell登录环境】然后运行指定Shell脚本文件
分析
使用bash执行test.sh脚本文件,发生错误说明当前环境为Shell非登录环境
Shell变量总结
变量类型
- 环境变量
- 自定义变量
- 特殊变量
作用域
-
环境变量
系统Shell配置文件提供, 全局都可以使用
分类 初始化环境变量过程执行文件顺序 shell登录环境变量初始化过程 /etc/profile--》/etc/profile.d/*.sh--》/.bash_profile--》/.bashrc--》/etc/bashrc shell非登录环境变量初始化过程 ~/.bashrc--》/etc/bashrc--》/etc/profile.d/*.sh -
自定义变量
局部变量: 当前Shell可以使用
全局变量: 当前Shell与子Shell可以使用
-
特殊变量
全局都可以使用
常用系统环境变量
变量名称 | 含义 |
---|---|
PATH | |
HOSTTYPE | |
LANG | |
HISTFILE | |
PWD |
常用系统特殊符号变量
特殊变量 | 含义 |
---|---|
$n |
|
$# |
|
$* 与 $@ |
|
$? |
|
$$ |
切换shell环境命令
分类 | 命令介绍 |
---|---|
切换为shell登录环境命令 | 方式1:直接使用用户名与密码登录系统 方式2:bash -l shell脚本文件 或 bash --login shell脚本文件 方式3:su 用户名 --login 或 -l |
切换为shell非登录环境命令 | 方式1:bash 方式2:su 用户名 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!