1 Shell变量

用于存储管理临时的数据,这些数据都在运行内存中

2 变量类型

  1. 系统环境变量
  2. 自定义变量
  3. 特殊符号变量

3 环境变量

3.1 系统环境变量

系统提供的共享变量,是系统加载Shell的配置文件定义的变量共享给所有Shell程序使用

3.2 Shell的配置文件类型

  • 全局配置文件
Bash
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
  • 个人配置文件
Text
当前用户/.bash_profile
当前用户/.bashrc

3.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 there

7 特殊变量

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
    命令
done

7.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/profile

9. 加载流程介绍

9.1 Shell工作环境

用户进入Linux系统就会初始化Shell环境,这个环境会加载全局配置文件和用户个人配置文件中环境变量,每个脚本都有自己的Shell环境

9.2 Shell工作环境分类

交互式和非交互式

**交互:**与用户互动,输入以恶命令 Shell立即返回

**非交互:**不需要用户参与就可以执行多个命令,比如Shell脚本文件

登录Shell与非登录Shell环境

是否需要用户名/密码区别

识别Shell环境类型

Bash
echo $0
输出-bash表示登录环境
输出bash表示非登录环境
bash #该命令切换Shell并且变为非登录环境

10. Shell字符串变量格式

字符串一共有三种格式

  1. 单引号方式

任何字符都会原样输出 拼接字符串使用无效

  1. 双引号方式 (推荐)

如果包含变量 变量会被解析得到值 然后输出

可以出现双引号的子字符串 引号需要转义

  1. 不用引号方式

和双引号一样 但是 不能出现空格 否则解析会出问题

11. Shell字符串变量拼接

  1. 无符号拼接
  2. 双引号拼接
  3. 混合拼接
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*}" # He

13. 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 # 删除整个数组