shell 变量

变量定义

变量名规则

  • 名称定义要做到见名知意,切按照规则来,切不得引用保留关键字 hp 检查保留字)
  • 只能包含数字、字母、下划线
  • 不能以数字开头
  • 不能用标点符号
  • 变量名严格区分大小写

环境变量设置

环境变量一般指的是用 export 内置命令导出的变量,用于定义 shell 的运行环境、保证 shell 命令的正确执行。

Shell 通过环境变量确定登录的用户名、PATH 路径、文件系统等各种应用。

环境变量可以在命令行中临时创建,但是用户退出 shell 终端,变量即丢失,

如要永久生效,需要修改环境变量配置文件

  • 用户个人配置文件 ~/.bash_profile、~/.bashrc 远程登录用户特有文件

  • 全局配置文件 /etc/profile、/etc/bashrc,且系统建议最好创建在/etc/profile.d/,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户

检查系统环境变量的命令

  • set,输出所有变量,包括全局变量、局部变量

  • env,只显示全局变量

  • declare,输出所有的变量,如同 set

  • export,显示和设置环境变量值

撤销环境变量

  • unset 变量名,删除变量或函数。

设置只读变量

  • readonly,只有 shell 结束,只读变量失效

环境变量加载顺序

image-20220626100023274

变量的作用域

  1. 每次调用bash/sh解释器执行脚本,都会开启一个子shell ,因此不保留当前的 shell 变量,通过 pstree 命令检查进程树

  2. 调用 source 或者点符号,在当前 shell 环境加载脚本,因此保留变量

# 解释
[root@centos7 ~]# cat a.sh
#!/bin/bash
name=`whoami`

[root@centos7 ~]# sh a.sh
[root@centos7 ~]# echo $name

[root@centos7 ~]# source a.sh
[root@centos7 ~]# echo $name
root
[root@centos7 ~]#

因为 执行脚本时,会启用一个子shell,因此 当前 终端shell环境不能得到 子shell 的环境变量;
执行 source 时,在当前shell 加载脚本,因此会保留环境变量;

shell 中特殊变量

$0   获取 shell 脚本文件名,以及脚本路径 
$n   获取 she11 脚本的第 n 个参数,n 在 1~9 之间,如$1,$2,$9,大于 9 则需要写,${10},参数空格隔开 
$#   获取执行的 shell 脚本后面的参数总个数 
$*   获取 shell 脚本所有参数,不加引号等同于 $@ 作用,加上引号 "$*" 作用是接收所有参数为单个字符串,"$1$2.. 
$@   不加引号,效果同上,加引号,是接收所有参数为独立字符串,如"$1" "$2" "$3"... 空格保留
    
$()		# 在括号中执行命令,且拿到命令的执行结果
${}		# 变量引用
``		# 执行命令,且拿到执行结果
()		# 开启子shell,执行命令
$vars	# 取出变量结果

Shell 特殊状态变量

$?	  上一次命令执行状态返回值,0正确,非0失败 
$$		 当前 she11 脚本的进程号 
$!		上一次后台进程的 PID
$_		 再次之前执行的命令,最后一个参数

查找方式 man bash
    	搜索 Special Parameters