当前位置: 首页 > news >正文

Shell 变量全解析:从基础到高级技巧

Shell 变量全解析:从基础到高级技巧

1. 什么是 Shell 变量?

1.1 变量的基本概念

想象一下变量就像是一个贴了标签的储物柜——你给储物柜一个名字(变量名),然后在里面存放东西(值)。之后只需要提到名字,就能取出里面的内容。

变量名规则:只能包含字母、数字或下划线,且不能以数字开头

bash

# 定义变量:变量名="值"(等号两边不能有空格)
[azurewhisky@shell ~]$ username="azurewhisky"# 使用变量:加上$前缀
[azurewhisky@shell ~]$ echo $username
azurewhisky

💡 提示:当值包含空格时,务必使用双引号括起来,否则会出错!

1.2 Shell 变量的特点

  • 弱类型:默认不区分整数、字符串等类型,一切皆字符串
  • 作用域:分为全局变量(整个Shell环境)和局部变量(仅当前脚本/函数)
  • 分类:普通变量(用户自定义)和环境变量(系统预定义+用户自定义)

2. 环境变量详解

2.1 什么是环境变量?

环境变量就像是Shell环境的全局设置,决定了Shell的行为方式。它们的特点是:

  • 通常使用大写字母命名
  • 可用于所有子进程(包括脚本、应用程序等)
  • 使用export命令导出为环境变量

2.2 常见环境变量一览

bash

# 查看所有环境变量
[azurewhisky@shell ~]$ env# 一些重要的环境变量:
HOME    # 当前用户的家目录
PATH    # 命令搜索路径
USER    # 当前用户名
PWD     # 当前工作目录
LANG    # 系统语言设置
PS1     # 命令行提示符格式

2.3 设置环境变量

bash

# 三种设置环境变量的方法
[azurewhisky@shell ~]$ export NAME="azurewhisky"
[azurewhisky@shell ~]$ declare -x NAME="azurewhisky"
[azurewhisky@shell ~]$ NAME="azurewhisky"; export NAME

2.4 让环境变量永久生效

想要环境变量每次登录都有效?把它们添加到配置文件中:

  • 用户级~/.bashrc(推荐)、~/.bash_profile
  • 系统级/etc/bashrc/etc/profile/etc/profile.d/目录

💡 小技巧:在/etc/profile.d/中放置脚本文件,无需执行权限即可在登录时自动加载!

2.5 登录提示信息设置

bash

# 方法1:编辑/etc/motd文件(登录后显示)
[azurewhisky@shell ~]$ sudo vim /etc/motd
Welcome to azurewhisky's Linux training!# 方法2:在/etc/profile.d/创建脚本
[azurewhisky@shell ~]$ sudo vim /etc/profile.d/welcome.sh
echo "Have a great day!"

3. 普通变量实战

3.1 定义变量的三种方式

bash

# 1. 直接赋值(适合简单字符串)
[azurewhisky@shell ~]$ a=192.168.1.2# 2. 单引号(原样输出,不解析特殊字符)
[azurewhisky@shell ~]$ b='192.168.1.2-$a'  # 输出:192.168.1.2-$a# 3. 双引号(解析变量和特殊字符)
[azurewhisky@shell ~]$ c="192.168.1.2-$a"  # 输出:192.168.1.2-192.168.1.2

3.2 获取命令执行结果

bash

# 方法1:反引号(不推荐,易混淆)
[azurewhisky@shell ~]$ CMD1=`ls`# 方法2:$()(推荐使用)
[azurewhisky@shell ~]$ CMD2=$(date +%A)
[azurewhisky@shell ~]$ echo "Today is $CMD2."
Today is Friday.

3.3 变量命名规范

bash

# 驼峰式(首单词小写)
azurewhiskyAge=18
azurewhiskySex="man"# 下划线分隔
azurewhisky_age=18# 全大写(常用于环境变量)
azurewhisky_AGE=18

4. Shell 特殊变量

4.1 位置参数变量

这些变量让你可以获取脚本的参数信息:

bash

#!/bin/bash
# showargs.sh 脚本内容
echo "脚本名: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数总数: $#"
echo "所有参数: $*"
echo "所有参数(保留空格): $@"# 运行结果
[azurewhisky@shell ~]$ bash showargs.sh hello world
脚本名: showargs.sh
第一个参数: hello
第二个参数: world
参数总数: 2
所有参数: hello world
所有参数(保留空格): hello world

4.2 特殊状态变量

bash

# $?:上一条命令的退出状态(0=成功,非0=失败)
[azurewhisky@shell ~]$ ls /nonexistent
ls: 无法访问'/nonexistent': 没有那个文件或目录
[azurewhisky@shell ~]$ echo $?
2# $$:当前Shell的进程ID
[azurewhisky@shell ~]$ echo $$
1234# $_:上一个命令的最后一个参数
[azurewhisky@shell ~]$ ls /etc/hosts /etc/passwd
[azurewhisky@shell ~]$ cat $_
# 显示/etc/passwd的内容

5. Shell 内置命令技巧

5.1 echo 输出控制

bash

# -n:不换行输出
[azurewhisky@shell ~]$ echo -n "Hello "; echo "World"
Hello World# -e:解析转义字符
[azurewhisky@shell ~]$ echo -e "Line1\nLine2"
Line1
Line2# 特殊转义符
\b    # 退格(删除前一个字符)
\t    # 制表符
\n    # 换行

5.2 read 读取输入

bash

#!/bin/bash
# read.sh 脚本内容
read -p "请输入你的名字: " name
echo "你好, $name!"# 密码输入(不显示内容)
read -s -p "请输入密码: " password
echo "密码已接收!"

5.3 exec 命令执行

bash

# exec执行命令后替代当前Shell
[azurewhisky@shell ~]$ exec sleep 5
# 5秒后会自动退出当前Shell# 从文件读取输入
exec < /tmp/input.txt
while read line; doecho "读取: $line"
done

5.4 shift 参数处理

bash

#!/bin/bash
# 处理带选项的参数
if [ "$1" = "-c" ]; thenshift  # 移除-c选项
fi
command="$1"
echo "执行命令: $command"# 运行结果
[azurewhisky@shell ~]$ bash script.sh -c date
执行命令: date

6. 变量高级操作

6.1 变量子串操作

bash

[azurewhisky@shell ~]$ str="abc123abc123"# 字符串长度
[azurewhisky@shell ~]$ echo ${#str}
12# 子串提取
[azurewhisky@shell ~]$ echo ${str:3}     # 从位置3开始到结尾
123abc123
[azurewhisky@shell ~]$ echo ${str:3:4}   # 从位置3开始取4个字符
123a# 字符串删除
[azurewhisky@shell ~]$ echo ${str#a*c}   # 从开头删除最短匹配
123abc123
[azurewhisky@shell ~]$ echo ${str##a*c}  # 从开头删除最长匹配
123# 字符串替换
[azurewhisky@shell ~]$ echo ${str/abc/def}   # 替换第一个匹配
def123abc123
[azurewhisky@shell ~]$ echo ${str//abc/def}  # 替换所有匹配
def123def123

6.2 实际应用案例

案例1:批量重命名文件

bash

# 将2022改为2021
[azurewhisky@shell ~]$ file="photo-202212-snap.jpg"
[azurewhisky@shell ~]$ mv $file ${file/2022/2021}
# 结果:photo-202112-snap.jpg# 删除中间部分
[azurewhisky@shell ~]$ mv $file ${file/-snap/}
# 结果:photo-202212.jpg

案例2:安全删除文件

bash

#!/bin/bash
# 防止path变量未定义导致误删
find ${path:-/tmp} -name "*.log" -mtime +30 | xargs rm -f
# 如果path未设置,默认搜索/tmp目录

6.3 特殊扩展变量

bash

# ${var:-default}:如果var未设置,使用default
[azurewhisky@shell ~]$ echo ${undefined:-"默认值"}
默认值# ${var:=default}:如果var未设置,先设置再使用
[azurewhisky@shell ~]$ echo ${name:="azurewhisky"}
azurewhisky
[azurewhisky@shell ~]$ echo $name
azurewhisky# ${var:?error}:如果var未设置,显示错误并退出
[azurewhisky@shell ~]$ echo ${required:?"该变量必须设置"}
-bash: required: 该变量必须设置# ${var:+value}:如果var已设置,使用value
[azurewhisky@shell ~]$ name="azurewhisky"
[azurewhisky@shell ~]$ echo ${name:+"已设置"}
已设置
  1. 综合实践与总结

7.1 变量使用最佳实践

  1. 命名规范:选择有意义的变量名,保持一致性
  2. 引号使用:含空格的字符串始终使用双引号
  3. 环境变量:使用大写字母命名,export导出
  4. 错误处理:使用${var:-default}防止未定义变量错误
  5. 代码可读性:添加注释,说明变量的用途

7.2 实用脚本示例

bash

#!/bin/bash
# system_info.sh - 显示系统信息# 使用默认值防止未定义变量
HOSTNAME=${HOSTNAME:-$(hostname)}
USER=${USER:-$(whoami)}# 获取系统负载
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}')# 显示信息
echo "系统信息报告"
echo "主机名: $HOSTNAME"
echo "当前用户: $USER"
echo "系统负载: $LOAD_AVG"
echo "报告生成时间: $(date)"

希望这篇笔记帮助你轻松掌握Shell变量的使用!记住,多实践是学习的关键,尝试在自己的脚本中应用这些技巧吧!

http://www.xdnf.cn/news/1340713.html

相关文章:

  • C语言基础习题——01
  • mac的m3芯片安装JDK8、JDK17
  • QWidget/QMainWindow与QLayout的布局
  • 家里Windows,公司Linux?通过cpolar,WSL开发环境无缝切换
  • 【STM32】HAL库中的实现(九):SPI(串行外设接口)
  • 智能求职推荐系统演示说明
  • 封装FTPSClient连接ftps服务器
  • 27、设备状态监测与维护管理 (模拟电机振动) - /安全与维护组件/device-condition-monitoring
  • 【用户管理】修改文件权限
  • DeepSeek V3.1正式发布,专为下代国产芯设计
  • opencv学习:图像边缘检测
  • 8.21IPSEC安全基础后篇,IKE工作过程
  • 基于Matlab的饮料满瓶检测图像处理
  • 面试压力测试破解:如何从容应对棘手问题与挑战
  • 火语言 RPA 进阶功能:让自动化更实用​
  • 利用DeepSeek编写调用系统命令用正则表达式替换文件中文本的程序
  • vmware安装centos7
  • 大数据毕业设计选题推荐-基于大数据的鲍鱼多重生理特征数据可视化分析系统-Spark-Hadoop-Bigdata
  • 代码随想录算法训练营27天 | ​​56. 合并区间、738.单调递增的数字、968.监控二叉树(提高)
  • 嵌入式-中断的概念,优先级,编程-Day17
  • 亚马逊站外推广效能重构:自然排名提升的逻辑与实操边界
  • 底层逻辑颠覆者:Agentic BI如何通过“Data + AI Agent”架构重构数据价值链?
  • Trae AI 超级团队
  • matplotlib 6 - Gallery Images
  • 力扣905:按奇偶排序数组
  • 【GPT入门】第52课 openwebui安装与使用
  • postman接口自动化测试
  • redis在Spring中应用相关
  • Django ModelForm
  • C#基础编程核心知识点总结