3.Shell 变量基础知识
3.1 什么是 Shell 变量
3.1.1 什么是变量
单地说,变量名是用一个固定的字符串(字符、数字和下划线的组合,不能以数字开头)代替 更多、更复杂的内容,该内容里可能还会包含变量、路径、字符串等其他的内容。 变量是暂时存储数据的地方及数据标记,所存储的数据存在于内存空间中,通过正确地调用内存 空间中变量的名字就可以取出与变量对应的数据。使用变量的最大好处就是使程序开发更为方 便,当然,在编程中使用变量也是必须的,否则就很难完成相关的程序开发工作。
bash
# 定义变量,名字为username,对应的内容laoma
[root@server ~ 18:48:15]# username="man"
# 打印变量的值
[root@server ~ 18:48:35]# echo "$username"
man
变量的赋值方式为:先写变量名称,紧接着是这个字符,最后是值,中间无任何空格。
通过 echo 命令加上 $username 即可输出 username 变量的值。变量的内容一般要加双引号, 以防止出错,特别是当值里的内容之间有空格时。
3.1.3 变量类型
变量根据范围可分为两类:
**全局变量,**在创建它们的 Shell 及其派生出来的任意子进程 Shell 中使用
局部变量,只能在创建它们的 Shell 函数或 Shell 脚本中使用。
变量根据是否是用户自定义也可分为两类:
普通变量:也称为常规变量,由开发者在开发脚本程序时创建。
**环境变量:**定义shell 执行环境。环境变量又可分为自定义环境变量和bash内置的环境变 量。
3.2 环境变量
环境变量一般是指用export内置命令导出的变量,用于定义 Shell 的运行环境,保证 Shell 命令 的正确执行
在查看设置的变量时,有3个命令可以显示变量的值:
set 命令,输出所有的变量,包括全局变量和局部变量。
env 命令,只显示全局变量,包括shell的环境。
declare 命令,输出所有的变量、函数、整数和已经导出的变量。 set -o 命令显示bash Shell 的所有参数配置信息。
3.2.1 设置环境变量
设置环境变量
如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用 **export 命令,**具体设置见 下文的示例。其实,除了 export 命令,带 -x 选项的 declare 内置命令也可以完成同样的功
export 命令和 declare 命令的格式如下:
export 变量名=value
变量名=value ; export
变量名 declare -x 变量名=value
示例:
bash
export NAME=laoma
declare -x NAME=laoma
NAME=laoma;export NAME
下面来看看让环境变量永久生效的常用设置文件。
用户的环境变量配置文件 : ~/.bash_profile 和 ~/.bashrc 。推荐在(~/.bashrc)文件 中设置
全局环境变量的配置文件: /etc/profile 、 /etc/bashrc 、 /etc/profile.d/ 。推荐在 /etc/bashrc 文件中设置。若要在登录后初始化或显示加载内容,则把脚本文件放
. 设置登录后提示信息
- 第一种是在 /etc/motd 里增加提示的字符串,如下:
bash
[root@server ~ 18:48:51]# vim /etc/motd
Last login: Tue Jan 27 18:44:21 2026 from 10.1.8.1
"超级无敌暴龙战神"
[root@server ~ 18:56:25]#
- 第二种是在 /etc/profile.d/ 下面增加如下脚本。
bash
[root@server ~ 18:56:48]# vim /etc/profile.d/laoma.sh
echo "hello "
补充: 登录前提示符由文件 /etc/issue 提供。
登录后时间提示符由ssh服务提供:在 /etc/ssh/sshd_config 文件中配置 PrintLastLog yes ,默认启用。
3.2.2 显示与取消环境变量
-
通过 echo 或 printf 命令打印环境变量。
-
用 env 或 set 显示默认的环境变量。
-
用 unset 消除本地变量和环境变量。
3.2.3 环境变量初始化与对应文件的生效顺序
登录 Linux 系统并启动一个 bash shell 时,默认情况下 bash 会在若干个文件中查找环境变 量的设置。这些文件可统称为系统环境文件。 bash 检查的环境变量文件的情况取决于系统运行 Shell 的方式。
系统运行 Shell 的方式一般有3种:
- 通过系统用户登录后默认运行的 Shell 。
- 非登录交互式运行 Shell 。
-
- 执行脚本运行非交互式 Shell 。
当用户登录Linux系统时, Shell 会作为登录 Shell 启动。此时的登录 Shell 加载环境变量的顺序
-
用户登录系统后首先会加载 /etc/profile 全局环境变量文件,这是Linux系统上默认的 Shell 主环境变量文件。系统上每个用户登录都会加载这个文件。
-
当加载完 /etc/profile 文件后,才会执行 /etc/profile.d 目录下的脚本文件,这个目录 下的脚本文件有很多,例如:系统的字符集设置等。
-
之后开始运行 HOME/.bash_profile 。在这个文件中,又会去找 HOME/.bashrc :如果 有,则执行;如果没有,则不执行。在 HOME/.bashrc 文件中又会去找 /etc/bashrc (全局 环境变量文件),如果有,则执行,如果没有,则不执行。
-
如果用户的 Shell 不是登录时启动的,比如手动敲下bash时启动,那么这种非登录 Shell 只 会加载 $HOME/.bashrc (用户环境变量文件),并会去找 /etc/bashrc (全局环境变量文 件)。
因此如果希望在非登录 Shell 下也可读到设置的环境变量等内容,就需要将变量设定等写入 HOME/.bashrc 或者 /etc/bashrc ,而不是 HOME/.bash_profile 或 /etc/profile 。
3.2.4 环境变量的知识小结
变量名通常要大写。
变量可以在自身的 Shell 及子 Shell 中使用。
常用 export 来定义环境变量。
执行 env 默认可以显示所有的环境变量名称及对应的值。
输出时用 $变量名 ,取消时用 unset变量名 。
书写 crond 定时任务时要注意,脚本要用到的环境变量最好先在所执行的 Shell 脚本中重新 定义。
如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。
3.3 普通变量
为普通变量的定义赋值,一般有以下3 种写法:
变量名=value ,赋值时不加引号。
变量名='value' ,赋值时加单引号。
变量名="value" ,赋值时加双引号。
3.3.2 变量名及变量值要求
变量名:一般是由字母、 数字 、下划线组成的,只可以以字母或下划线开头,例如: laoma 、 laoma_123 、 laoma_training 。
变量值:可以用单引号或双引号引起来,也可不加引号,但是这三者的含义是不同的。
3.3.3 普通变量的定义及输出示例
采用不同的方式对普通变量进行定义,并打印输出。
示例1:
bash
[root@server ~ 19:06:34]# a=192.168.1.2
[root@server ~ 19:06:38]# b='192.168.1.2'
[root@server ~ 19:06:42]# c="192.168.1.2"
[root@server ~ 19:06:46]# echo "a=$a"
a=192.168.1.2
[root@server ~ 19:06:52]# echo "b=$b"
b=192.168.1.2
[root@server ~ 19:06:56]# echo "c=${c}"
c=192.168.1.2
可见, 将连续的普通字符串的内容赋值给变量,不管用不用引号,或者不管用什么引号,它的内 容是什么,打印变量时就会输出什么。
示例2:
bash
#接上面a b c
[root@server ~ 19:07:00]# echo "a=$a"
a=192.168.1.2
[root@server ~ 19:08:13]# echo "b=$b"
b=192.168.1.2
[root@server ~ 19:08:18]# echo "c=${c}"
c=192.168.1.2
3.3.4 把命令的结果作为变量的内容赋值
常见方法有两种,以ls命令为例:
变量名=command,把命令用反引号引起来,不推荐使用这种方法,因为容易和单引号 混淆。 变量名= ( c o m m a n d ) ,把命令用 (command) ,把命令用 (command),把命令用()括起来 ,推荐使用这种方法。
bash
[root@server ~ 19:10:46]# ls
anaconda-ks.cfg bin
[root@server ~ 19:10:51]# CMD1=`ls`
[root@server ~ 19:10:59]# echo $CMD1
anaconda-ks.cfg bin
[root@server ~ 19:11:05]# CMD2=$(pwd)
[root@server ~ 19:11:10]# echo $CMD2
/root
[root@server ~ 19:11:17]# date +%A
Tuesday
[root@server ~ 19:11:22]# echo Today is $(date +%A).
Today is Tuesday.