3.Shell 变量基础知识

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 文件中设置。若要在登录后初始化或显示加载内容,则把脚本文件放

. 设置登录后提示信息
  1. 第一种是在 /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]# 
  1. 第二种是在 /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 显示与取消环境变量
  1. 通过 echo 或 printf 命令打印环境变量。

  2. 用 env 或 set 显示默认的环境变量。

  3. 用 unset 消除本地变量和环境变量。

3.2.3 环境变量初始化与对应文件的生效顺序

登录 Linux 系统并启动一个 bash shell 时,默认情况下 bash 会在若干个文件中查找环境变 量的设置。这些文件可统称为系统环境文件。 bash 检查的环境变量文件的情况取决于系统运行 Shell 的方式。

系统运行 Shell 的方式一般有3种:

  1. 通过系统用户登录后默认运行的 Shell 。
  2. 非登录交互式运行 Shell 。
    1. 执行脚本运行非交互式 Shell 。

当用户登录Linux系统时, Shell 会作为登录 Shell 启动。此时的登录 Shell 加载环境变量的顺序

  1. 用户登录系统后首先会加载 /etc/profile 全局环境变量文件,这是Linux系统上默认的 Shell 主环境变量文件。系统上每个用户登录都会加载这个文件。

  2. 当加载完 /etc/profile 文件后,才会执行 /etc/profile.d 目录下的脚本文件,这个目录 下的脚本文件有很多,例如:系统的字符集设置等。

  3. 之后开始运行 HOME/.bash_profile 。在这个文件中,又会去找 HOME/.bashrc :如果 有,则执行;如果没有,则不执行。在 HOME/.bashrc 文件中又会去找 /etc/bashrc (全局 环境变量文件),如果有,则执行,如果没有,则不执行。

  4. 如果用户的 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.
相关推荐
Leinwin4 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382504 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇4 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7594 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣5 小时前
智能体选型实战指南
运维·人工智能
yy55275 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ6 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔7 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密7 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20157 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑