【网络运维】初见Shell:Shell 变量基础知识
Shell 变量基础知识
什么是 Shell 变量
什么是变量
简单来说,变量就是用一个固定的字符串(由字母、数字和下划线组成,且不能以数字开头)来代替更复杂的内容,这些内容可能包含其他变量、路径、字符串等。
变量是临时存储数据的地方,数据存在于内存中,通过正确调用变量名就可以取出对应的数据。使用变量能让程序开发更加方便,也是编程中必不可少的部分。
下面是一个定义和打印变量的简单示例:
# 定义变量 username,值为 furongwang
[furongwang@shell ~]$ username="furongwang"# 打印变量的值
[furongwang@shell ~]$ echo $username
furongwang
变量赋值的格式是:变量名=值,中间不能有空格。使用 echo $变量名
可以输出变量的值。建议变量内容用双引号 (()) 括起来,避免值中包含空格时出错。
Shell 变量的特性
默认情况下,Shell 不区分变量类型,所有变量(整数、字符串、小数等)都被视为字符串。这与 Java、C 等强类型语言不同。如果需要指定变量类型,可以使用 declare
命令,但一般情况下不需要这样做。
变量类型
根据作用范围,变量可分为两类:
- 全局变量:在创建它们的 Shell 及其所有子进程中使用。
- 局部变量:只能在创建它们的 Shell 函数或脚本中使用。
根据是否由用户自定义,也可分为两类:
- 普通变量:由开发者在脚本中创建。
- 环境变量:用于定义 Shell 的执行环境,包括自定义和内置的环境变量。
环境变量
环境变量是用 export
命令导出的变量,用于定义 Shell 的运行环境,确保命令正确执行。Shell 通过环境变量确定登录用户名、命令路径、终端类型等。所有环境变量都是全局变量,可用于所有子进程。
环境变量通常在以下文件中定义以实现永久生效:
- 用户级:
~/.bash_profile
、~/.bashrc
(推荐) - 全局级:
/etc/profile
、/etc/bashrc
、/etc/profile.d/
环境变量名通常为大写,例如:
EDITOR
:默认编辑器HISTSIZE
:历史命令个数PATH
:命令搜索路径HOME
:用户家目录USER
:当前用户PWD
:当前路径
查看变量的命令:
set
:显示所有变量(包括局部变量)env
:只显示全局变量declare
:显示所有变量、函数、整数和已导出的变量
设置环境变量
使用以下任一方式设置环境变量:
export NAME=furongwang
declare -x NAME=furongwang
NAME=furongwang; export NAME
推荐将环境变量定义在 ~/.bashrc
(用户级)或 /etc/bashrc
(全局级)。
设置登录提示信息
有两种方式设置登录后的提示信息:
- 编辑
/etc/motd
文件:
sudo vim /etc/motd
# 添加:welcome to furongwang linux Shell training.
- 在
/etc/profile.d/
下创建脚本:
sudo vim /etc/profile.d/furongwang.sh
# 添加:echo "Welcome to furongwang linux Shell training."
登录前提示由 /etc/issue
控制,登录时间提示由 SSH 配置 PrintLastLog yes
控制。
显示与取消环境变量
- 使用
echo
或printf
打印变量 - 使用
env
或set
查看变量 - 使用
unset
取消变量
环境变量加载顺序
Shell 启动方式不同,加载的环境变量文件也不同:
-
登录 Shell:
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
→~/.bashrc
→/etc/bashrc
-
非登录交互式 Shell:
~/.bashrc
→/etc/bashrc
-
非交互式 Shell(如脚本):
- 仅加载当前环境中已定义的变量
环境变量小结
- 变量名通常大写
- 变量在自身 Shell 和子 Shell 中有效
- 使用
export
导出环境变量 - 使用
env
查看所有环境变量 - 使用
$变量名
输出,unset
取消 - 在定时任务中最好重新定义所需环境变量
- 将永久变量放在
~/.bashrc
或/etc/bashrc
中
普通变量
普通变量仅在当前 Shell 生命周期中有效,退出或启动子进程后无效。
定义普通变量
三种赋值方式:
变量名=value
(不加引号)变量名='value'
(单引号)变量名="value"
(双引号)
变量名与变量值规范
- 变量名:字母、数字、下划线,不能以数字开头
- 变量值:是否加引号会影响解析行为
示例解析
a=192.168.1.2-$a # 解析变量后再赋值
b='192.168.1.2-$a' # 原样输出,不解析变量
c="192.168.1.2-$a" # 解析变量后再输出
- 不加引号:解析变量和命令
- 单引号:原样输出
- 双引号:解析变量和命令后输出
将命令结果赋值给变量
两种常用方式:
CMD1=`ls` # 反引号(不推荐)
CMD2=$(pwd) # $()(推荐)echo $CMD1
echo $CMD2
echo "Today is $(date +%A)."
推荐使用 $()
,更清晰易读。
变量定义技巧总结
-
变量命名规范:
- 见名知意,推荐使用驼峰或下划线分隔
- 示例:
furongwangAge
、furongwang_age
、furongwangAge
、furongwang_AGE
-
赋值方式:
- 普通字符串可不加引号或加双引号
- 原样输出用单引号
- 命令解析用
$()
-
使用变量:
- 输出时加
$
,如$var
或${var}
- 在
unset
、export
、(())
等场景中不加$
- 输出时加
-
学习建议:
- 参考系统脚本(如
/etc/init.d/functions
)中的变量定义方式 - 形成自己的编码规范和习惯
- 参考系统脚本(如