1 Shell变量
用于存储管理临时的数据,这些数据都在运行内存中
2 变量类型
- 系统环境变量
- 自定义变量
- 特殊符号变量
3 环境变量
3.1 系统环境变量
系统提供的共享变量,是系统加载Shell的配置文件定义的变量共享给所有Shell程序使用
3.2 Shell的配置文件类型
- 全局配置文件
❯Bash
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc- 个人配置文件
❯Text
当前用户/.bash_profile
当前用户/.bashrc3.3 环境变量分类
系统级别和用户级别 加载的配置文件不同
3.4 查看Shell变量方式
❯Bash
env # 当前Shell系统环境变量
SET # 查看系统环境变量 自定义环境变量 函数3.5 常用系统环境变量
| SHELL | 当前shell解析器类型 |
|---|---|
| PWD | 当前所在路径 |
| LOGNAME | 当前登录用户名 |
| HOME | 当前家目录绝对路径 |
| LANG | 系统语言环境 en_US.UTF-8 英文 zh_CN.UTF-8 中文 |
| USER | 当前用户 |
| OLDPWD | 显示之前路径 |
4 自定义变量
4.1 自定义局部变量
定义在一个脚本文件中的变量 只能在当前脚本文件中使用
定义语法和规则
❯Bash
var_name=Hello
message="Hello World"
# 等号两侧不能有空格
# 默认类型是字符串类型, 无法进行数值运算
# 变量的值如果有空格,必须用双引号括起来
# 不能使用Shell关键字变量查询语法
❯Bash
# 语法1:直接使用变量名查询
$var_name
# 语法2:使用花括号 适合拼接字符串
${var_name}变量删除
unset var_name
5 自定义常量
变量设置值之后不可以修改的变量
❯Bash
var_name=value
readonly var_name # 设置为只读 之后不可修改则认为是常量6 自定义全局变量
6.1 父子Shell环境
如果A.sh脚本中执行了B.sh脚本文件,A.sh为父Shell环境,B.sh为子Shell环境
同样的 如果从bash环境定义的变量 然后执行脚本 bash环境为shell脚本的父Shell环境
自定义全局变量可以在当前Shell环境和子Shell环境中使用
❯Bash
#!/bin/sh
## 当前脚本为shexport.sh
echo "MYVAR is: $MYVAR"
MYVAR="hi there"
echo "MYVAR is: $MYVAR"运行脚本
❯Bash
$ MYVAR=hello
$ ./shexport.sh
MYVAR is:
MYVAR is: hi there
# 无法到达预期结果 第一次MYVAR为空export 设置扩大变量范围到子Shell环境
❯Bash
$ MYVAR=hello
$ export MYVAR
$ ./shexport.sh
MYVAR is: hello
MYVAR is: hi there7 特殊变量
7.1 特殊变量:$n
❯Bash
$n
# 用于接受脚本文件执行传入的参数
# $0 当前脚本文件名称
# $1~9 获取的第1~9个参数
# 第十个以上用${数字}7.2 特殊变量:$#
❯Bash
$#
# 获取所有输入参数的个数7.3 特殊变量:$@ $*
❯Bash
$*
$@
# 获取所有输入参数 用于以后输出所有参数
# 不使用双引号括起来$1 $2 ... $n
# $* 使用双引号括起来拼接为一个字符串 "$1 $2 $3... $n"
# $@ 获取一组参数列表对象 格式为 "$1" "$2" ..."$n"
# 循环
for var in 列表变量
do
命令
done7.4 特殊变量:$?
❯Bash
$?
# 获取上一个Shell命令的状态码或者函数返回值
# 一般返回0表示执行成功 返回非0表示失败7.5 特殊变量:$$
❯Bash
$$
# 得到当前Shell环境的ID号8. 自定义系统环境变量
8.1 全局配置文件/ect/profile应用场景
当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量,供所有Shell程序使用
以后只有所有的Shell程序或者命令使用的变量,都可以定义在这个文件中
8.2 定义全局环境变量方式
❯Bash
# 增加命令:定义变量var=value 并到处为环境变量
export var=value
# 重载配置文件/ect/profile 配置文件修改后要重新加载后才可以生效
Source /ect/profile9. 加载流程介绍
9.1 Shell工作环境
用户进入Linux系统就会初始化Shell环境,这个环境会加载全局配置文件和用户个人配置文件中环境变量,每个脚本都有自己的Shell环境
9.2 Shell工作环境分类
交互式和非交互式
**交互:**与用户互动,输入以恶命令 Shell立即返回
**非交互:**不需要用户参与就可以执行多个命令,比如Shell脚本文件
登录Shell与非登录Shell环境
是否需要用户名/密码区别
识别Shell环境类型
❯Bash
echo $0
输出-bash表示登录环境
输出bash表示非登录环境
bash #该命令切换Shell并且变为非登录环境10. Shell字符串变量格式
字符串一共有三种格式
- 单引号方式
任何字符都会原样输出 拼接字符串使用无效
- 双引号方式 (推荐)
如果包含变量 变量会被解析得到值 然后输出
可以出现双引号的子字符串 引号需要转义
- 不用引号方式
和双引号一样 但是 不能出现空格 否则解析会出问题
11. Shell字符串变量拼接
- 无符号拼接
- 双引号拼接
- 混合拼接
❯Bash
var1=hello
var2=world
echo ${var1}${var2} # 第一种
echo "${var1}${var2}"
echo ${var1}"&"${var2}12. Shell字符串变量截取(bash)
| 格式 | 说明 |
|---|---|
| ${变量名:start:length} | 从string的start开始 向右截取length个字符 start从0开始 不包含0 |
| ${变量名:start} | 从string左边start个字符开始截取 直到最后 |
| ${变量名:0-start:length} | 从string右边start个开始 向右截取length个 start从1开始 代表右侧第一个 |
| ${变量名:0-start} | 从string右边start个开始 向右截取 直到最后 |
| ${变量名#*chars} | 从string左边第一次出现*chars的位置开始 截取到结尾 |
| ${变量名##*chars} | 从string左边最后一次出现*chars位置开始 截取全部 |
| ${变量名%chars*} | 从string字符串右边第一次出现chars的位置开始, 截取char左边全部 |
| ${变量名%%chars*} | 从string字符串右边最后一次出现chars的位置开始, 截取char左边全部 |
❯Bash
#!/bin/bash
str="Hello World, I love Linux Shell."
echo $str
# 起始从0开始 截取不包含0 H是第1个 d是第11个
echo '${str:0:11}:'"${str:0:11}" # Hello World
# 起始从13开始 截取不包含13 I是第14个 截取到结尾
echo '${str:13}:'"${str:13}" # I love Linux Shell.
echo '${str:0-6:5}:'"${str:0-6:5}" # Shell
echo '${str:0-12}:'"${str:0-12}" # Linux Shell.
echo '${str#*, }:'"${str#*, }" # o World, I love Linux Shell.
echo '${str##*ll}:'"${str##*ll}" # .
echo '${str%ll*}:'"${str%ll*}" # Hello World, I love Linux She
echo '${str%%ll*}:'"${str%%ll*}" # He13. Shell索引数组变量
❯Bash
# 定义
array_name=(name1 name2 ...) # 方式1
array_name=([索引下标1]=name1 [索引下标2]=name2 ...) # 方式2
# 查询
${arr[index]} # 获取单个值
item=${arr[index]} # 获取单个值并赋值
${arr[@]} # 获取数组全部值
${arr[*]} # 获取数组全部值
${#arr[@]} # 获取数组的长度
${#arr[@]} # 获取数组的长度
${#arr[index]} # 获取数组指定元素的字符长度
# 拼接
array_new=(${#arr1[@]} ${#arr2[@]})
array_new=(${#arr1[*]} ${#arr2[*]})
# 删除
unset array_name[index]
unset array_name # 删除整个数组