02-Shell变量
1.Shell变量
1.1 Shell变量的介绍
变量用于存储管理临时的数据, 这些数据都是在运行内存中的.
1.2 变量类型
- 系统环境变量
- 自定义变量
- 特殊符号变量
2.系统环境变量
2.1 介绍
系统环境变量是系统提供的共享变量.
系统环境变量是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用
2.2 Shell的配置文件分类
1.全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2.个人配置文件
当前用户/.bash_profile
当前用户/.bashrc
一般情况下,我们都是直接针对全局配置进行操作。
2.3 环境变量分类
在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量。
系统级环境变量:Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用, 全局共享
用户级环境变量:Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用, 登录用户使用
2.3.1 查看当前Shell系统环境变量
查看命令
env
2.3.2 查看Shell变量(系统环境变量+自定义变量+函数)
命令
set
2.3.2 常用系统环境变量
变量名称 | 含义 |
---|---|
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 |
2.3.3 环境变量输出演示
PATH:不同路径之间使用:
进行分割
3.自定义变量
3.1 自定义变量介绍
就是自己定义的变量
3.1.1 分类
- 自定义局部变量
- 自定义常量
- 自定义全局变量
3.2 自定义局部变量
3.2.1 介绍
就是定义在一个脚本文件中的变量, 只能在这个脚本文件中使用的变量, 就是局部变量
3.2.2 变量定义
定义语法
var_name=value
变量定义规则
- 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
- 等号两侧不能有空格
- 在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
- 变量的值如果有空格, 必须使用双引号括起来
- 不能使用Shell的关键字作为变量名称
3.2.3 变量值查询
# 语法1: 直接使用变量名查询
$var_name
# 语法2: 使用花括号
${var_name}
# 区别: 花括号方式适合拼接字符串
注意: 如果"My name is ${var2}Style"
中 $var2
不带花括号, 系统会认为获取$var2Style
变量数据, 这个变量不存在就获取不到数据,执行效果如下
结论: 推荐大家使用花括号才是编程好习惯
3.2.4 变量删除
unset var_name
3.3 自定义常量
3.3.1 介绍
就是变量设置值以后不可以修改的变量叫常量, 也叫只读变量
3.3.2 定义
readonly var_name
3.4 自定义全局变量
3.4.1 父子Shell环境介绍
例如: 有2个Shell脚本文件 A.sh 和 B.sh
如果 在A.sh脚本文件中执行了B.sh脚本文件, 那么A.sh就是父Shell环境, B.sh就是子Shell环境
3.4.2 自定义全局变量介绍
就是在当前脚本文件中定义全局变量, 这个全局变量可以在当前Shell环境与子Shell环境中都可以使用
3.4.3 自定义全局变量语法
export var_name1 var_name2
3.4.4 案例需求
测试全局变量在子Shell中是否可用, 在父Shell中是否可用
3.4.5 案例实现步骤
-
创建2个脚本文件 demo2.sh 和 demo3.sh
-
编辑demo2.sh
命令1:定义全局变量VAR4
命令2: 执行demo3.sh脚本文件
-
编辑demo3.sh
输出全局变量VAR4
-
执行demo2.sh脚本文件
3.4.6 案例演示
- 创建demo2.sh和demo3.sh文件
touch demo2.sh
touch demo3.sh
- 编辑demo2.sh, 里面定义变量VAR4并设置为全局, 并里面执行demo3.sh脚本文件
vim demo2.sh
3. 编辑demo3.sh, 里面打印VAR4
vim demo3.sh
4. 执行脚本文件demo2.sh, 观察打印VAR4效果
5. 执行脚本文件后, 在交互式Shell环境打印VAR4, 观察打印VAR4效果
全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用
4. 特殊变量
4.1 特殊变量:$n
$n
4.1.1 含义
- 用于接收脚本文件执行时传入的参数
- $0 用于获取当前脚本文件名称
- $1~$9, 代表获取第一输入参数到第9个输入参数
- 第10个以上的输入参数获取参数的格式: ${数字}, 否则无法获取
4.1.2 执行脚本文件传入参数语法
sh 脚本文件 输入参数1 输入参数2 ...
4.1.3 案例
创建脚本文件demo4.sh文件, 并在脚本文件内部执行打印脚本文件名字, 第一个输入参数, 第二个输入参数
实现步骤
-
创建脚本文件demo4.sh
-
编辑demo4.sh的文件内容
# 命令1: 打印当前脚本文件名字
# 命令2: 打印第1个输入参数
# 命令3: 打印第2个输入参数
# 命令4: 打印第10个输入参数
- 执行脚本文件demo4.sh
touch demo4.sh
vim demo4.sh
#!/bin/bash
echo "脚本文件的名称:$0"
echo "第一个参数的名称:$1"
echo "第二个参数的名称$2"
echo "第二个参数的名称${10}"
4.2 特殊变量:$#
$#
获取所有输入参数的个数
4.3 $*
、$@
4.3.1 含义及区别
$*
$@
# 含义都是获取所有输入参数, 用于以后输出所有参数
$*
与$@
区别
1.不使用双引号括起来, 功能一样
$*和$@获取所有输入参数,格式为: $1 $2 ... $n
2.使用双引号括起来
"$*"获取的所有参数拼接为一个字符串, 格式为: "$1 $2 ... $n"
"$@"获取一组参数列表对象, 格式为: "$1" "$2" ... "$n"
使用循环打印所有输入参数可以看出区别
循环语法
for var in 列表变量
do # 循环开始
命令 # 循环体
done # 循环结束
4.3.2 案例
在demo4.sh中循环打印输出所有输入参数, 体验$*
与$@
的区别
实现步骤
编辑demo4.sh脚本文件
# 增加命令: 实现直接输出所有输入后参数
# 增加命令: 使用循环打印输出所有输入参数
步骤
- 编辑demo4.sh文件
vim 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
- 观察结果
4.4 特殊变量:$?
4.4.1 语法
$?
4.4.2 含义
用于获取上一个Shell命令的退出状态码, 或者是函数的返回值
每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
一般来说, 返回0代表命令执行成功, 非0代表执行失败
4.4.3 演示
输入一个正确命令, 再输出$?
输入一个错误命令, 在输出$?
4.5 特殊变量:$$$
4.5.1 语法及含义
$$
含义
用于获取当前Shell环境的进程ID号
4.5.2 演示
查看当前Shell环境进程编号
ps -aux|grep bash
输出 $$ 显示当前shell环境进程编号