Shell变量与参数详解:环境变量、位置参数、特殊变量
Shell变量与参数详解环境变量、位置参数、特殊变量上一篇把变量怎么定义讲了个大概。真到写脚本时你会立刻遇到三个问题变量怎么传给子进程、脚本怎么接收调用者传进来的参数、以及那些$?、$#、$到底代表什么。这一篇把环境变量、位置参数和特殊变量系统过一遍它们是脚本和外部世界交换数据的全部接口。一、变量的作用域局部变量与环境变量先看一段代码感受一下区别# parent.sh nameTom export age18 bash child.sh# child.sh echo name$name echo age$age运行bash parent.sh预期输出name age18name在子进程里是空的age却被带过去了。差别就在export。不加export的变量只在当前 shell 可见子进程包括脚本、其他命令看不到。加了export的变量会被导出到环境里所有子进程都能继承。已经定义的变量事后加export age也能让它变成环境变量不用重新赋值。常用环境变量变量含义典型值PATH命令搜索路径冒号分隔/usr/local/bin:/usr/bin:/binHOME当前用户家目录/home/userPWD当前工作目录随时变化USER/LOGNAME当前用户名userSHELL当前登录 Shell/bin/bashLANG系统语言环境en_US.UTF-8TERM终端类型xterm-256colorHOSTNAME主机名服务器名查看全部环境变量用env或printenvprintenv PATH预期输出/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin⚠️ 常见错误改了PATH不生效在脚本里写PATH$PATH:/opt/app/bin跑完就没了因为脚本是子进程。要永久生效得写进~/.bashrc或/etc/profile.d/里然后source。PATH拼错冒号PATH$PATH/opt/bin少了冒号会把原来的整个路径替换成一长串所有命令都报command not found。改PATH之前先echo $PATH备份一下。环境变量被子进程改了不影响父进程子进程继承的是一份拷贝在子进程里改export age20父 shell 的age不会变。想影响父进程只能source。二、位置参数脚本怎么收参数运行脚本时在命令名后面跟的参数在脚本里按位置取出来就是位置参数。#!/bin/bash echo 脚本名是: $0 echo 第一个参数: $1 echo 第二个参数: $2 echo 第三个参数: $3保存为greet.sh执行chmod x greet.sh ./greet.sh Alice Beijing 25预期输出脚本名是: ./greet.sh 第一个参数: Alice 第二个参数: Beijing 第三个参数: 25位置参数的编号规则写法含义$0脚本本身的名字含你调用它时写的路径$1~$9第 1 到第 9 个参数${10}、${11}第 10 个及以后必须加花括号$#一共传进来几个参数$*所有参数合成一个字符串$所有参数每个参数独立为什么${10}要加花括号因为$10会被 shell 解析成$1 后面跟个 0输出第一个参数的值再拼个字符 0。超过 9 个参数时不加花括号一定翻车。shift把参数队列往前挪位置参数是个队列shift命令能把整个队列左移一位原来的$2变成新的$1#!/bin/bash echo 一开始有 $# 个参数 while [ $# -gt 0 ]; do echo 处理参数: $1 shift done执行./shift.sh a b c预期输出一开始有 3 个参数 处理参数: a 处理参数: b 处理参数: c这种写法在解析可选参数比如-f、-o file时非常好用。三、特殊变量一览Shell 预定义了一批特殊变量全部大写用来拿运行时的状态。变量含义$?上一条命令的退出码0 表示成功非 0 表示失败$$当前脚本的进程号PID$!最近一个后台进程的 PID$#位置参数个数$*所有位置参数合为一个串$所有位置参数独立逐项$-当前 shell 的选项标志$_上一条命令的最后一个参数$?脚本里最常打交道的变量ls /etc/hostname echo ls 成功退出码: $? ls /notexist echo ls 失败退出码: $?预期输出/etc/hostname ls 成功退出码: 0 ls: cannot access /notexist: No such file or directory ls 失败退出码: 2脚本里判断上一条命令成不成功靠的就是$?。下一篇讲if条件判断时会大量用到它。自己写脚本exit 1就能主动返回错误码调用方据此判断要不要继续。$$和$!进程号$$在脚本里常用于生成临时文件的唯一名避免多开冲突tmpfile/tmp/myapp_$$.tmp echo 临时文件: $tmpfile touch $tmpfile预期输出PID 每次运行都不同临时文件: /tmp/myapp_12345.tmp$!配合后台任务用。启动sleep 30 后立刻echo $!就能拿到那个后台 sleep 的 PID后面好 kill 它。四、$*和$的区别面试和实战都爱考这两个不加引号时几乎一样一加引号就彻底分家。#!/bin/bash echo --- 用 $* --- for arg in $*; do echo 一个元素: [$arg] done echo --- 用 $ --- for arg in $; do echo 一个元素: [$arg] done执行./diff.sh apple red fruit banana预期输出--- 用 $* --- 一个元素: [apple red fruit banana] --- 用 $ --- 一个元素: [apple] 一个元素: [red fruit] 一个元素: [banana]带引号时$*把所有参数拼成一个字符串中间用 IFS默认空格连接$保持每个参数独立带空格的参数不会被拆碎。写循环处理参数时永远用$这是唯一安全的写法。完整示例把所有参数原样传给另一个命令#!/bin/bash # my_grep.sh: 包装一下 grep加颜色 grep --colorauto $这样./my_grep.sh error /var/log/syslog会把error和/var/log/syslog两个参数原样转给 grep。如果改成grep --colorauto $*带空格的搜索词就会被拆成好几个参数grep 直接报错。五、read让脚本停下来等你输入参数不够用的时候脚本还能在运行中交互提问#!/bin/bash read -p 你叫什么名字? username read -p 你今年多大? age echo 你好 $username再过一年你就 $((age 1)) 岁了执行./ask.sh预期输出斜体部分是用户输入你叫什么名字? Benothing 你今年多大? 22 你好 Benothing再过一年你就 23 岁了read的几个常用选项选项作用-p 提示语输入前打印一行提示-s静默输入打字不回显适合密码-t 秒数超时自动放弃-a 数组名读入一组词存进数组写密码提示时一定要配-s否则密码会清清楚楚打在屏幕上。六、知识扩展环境变量是怎么被子进程继承的你在终端敲export age18然后bash child.shchild.sh里的age从哪来这不是 shell 的魔法是操作系统提供的环境块。每个进程在内核里都有两块内存一块是命令行参数argv另一块叫环境块envp。父进程fork()出子进程时内核会把父进程的环境块完整拷贝一份给子进程。子进程里改任何环境变量改的都是自己那份拷贝父进程看不到。export干的事是把一个 shell 变量从shell 私有变量标记成需要放进环境块。下次 fork 子进程时这个变量就跟着拷贝过去了。这条机制解释了三个常见现象为什么/etc/profile、~/.bashrc改完要source因为它们是在当前 shell 里执行的改完立刻对当前进程生效如果直接bash profile.sh执行变量跑完就随子进程一起消失了。为什么 Docker 容器里-e KEYval能传进容器因为容器本质是宿主机上的一个子进程启动时把 KEYval 塞进了它的环境块。为什么 C 语言里main(int argc, char *argv[], char *envp[])能拿到环境变量就是内核传给它的这块内存。脚本对外传数据用export 子进程脚本对内收数据用位置参数和$。把这两组接口用熟自动化脚本就能和外部系统接得很干净。

相关新闻

经济学毕业论文怎么写?宏观数据、变量关系和经济解释怎么避免只做趋势分析

经济学毕业论文怎么写?宏观数据、变量关系和经济解释怎么避免只做趋势分析

经济学毕业论文怎么写?宏观数据、变量关系和经济解释怎么避免只做趋势分析 经济学毕业论文最容易出现的问题,是数据很多、图表很多,但真正的经济问题并不清楚。GDP、消费、投资、就业、房价、人口等指标做成趋势图以后,如果只是写…

2026/10/2 18:12:07 阅读更多 →
YOLOv8猴子检测权重训练:从数据集标注到模型部署全流程

YOLOv8猴子检测权重训练:从数据集标注到模型部署全流程

简介:一套面向目标检测场景的猴子识别资源,包含YOLOv8预训练权重与配套数据集。资源整合了6000余张标注为Monkey的猴子图像,已按train、val、test划分完毕,并附有data.yaml配置文件和TXT格式的标签,可直接对接YOLOv5、…

2026/10/3 18:15:15 阅读更多 →
Android开发必备:用Layout Inspector看清View树与布局层级

Android开发必备:用Layout Inspector看清View树与布局层级

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 18:16:08 阅读更多 →

最新新闻

龙勃透镜电磁聚焦原理与Matlab仿真实现:雷达增益提升的工程解读

龙勃透镜电磁聚焦原理与Matlab仿真实现:雷达增益提升的工程解读

雷达信号中的“光学魔术”:用Matlab模拟龙勃透镜的聚焦放大效应做雷达信号处理这些年,我一直对天线和传播路径上的“另类”器件很感兴趣。龙勃透镜这名字听着像光学里的东西,但它在雷达领域的作用其实非常硬核——把一个球形的介质透镜放在天…

2026/10/3 20:47:48 阅读更多 →
Go语言实现三数之和:排序+双指针去重技巧全解析

Go语言实现三数之和:排序+双指针去重技巧全解析

这道题我刷了好几遍,每次在面试前都会把它翻出来重新写一遍。不是说它难,而是它在 LeetCode Hot 100 里的地位很特别——你几乎不可能在真正的面试里碰到一模一样的三数之和,但面试官完全可能换一个壳,考你排序加双指针这个组合套…

2026/10/3 20:47:48 阅读更多 →
Redis服务器部署与生产级排障实战:从安装到缓存治理

Redis服务器部署与生产级排障实战:从安装到缓存治理

服务器之 Redis:从零搭建到生产级排障的完整实战笔记 Redis 在服务器端的重要性,根本不需要我再多吹。只要你的系统扛过一定的并发,Redis 基本就是那根绕不开的“救命稻草”。它是高性能键值存储服务器,能做缓存、分布式锁、消息队…

2026/10/3 20:47:48 阅读更多 →
人机协同实战指南:从分工逻辑到落地流程

人机协同实战指南:从分工逻辑到落地流程

做AI项目这几年,我越来越觉得,真正决定项目上限的往往不是模型本身的参数量,而是我们和AI协作的方式。人机协同不是一句贴在PPT里的口号,它直接决定了你是被AI替代,还是用AI放大自己的能力。这篇内容算是“AI全景”系列…

2026/10/3 20:47:48 阅读更多 →
Node.js全栈实战:天远车牌查询API从接入到上线

Node.js全栈实战:天远车牌查询API从接入到上线

现在不少做车辆管理、出行服务、二手车核验的朋友都在找车牌查询接口,但真正能把整套调用流程跑通、并且知道怎么接到自己业务里的人其实不多。这个标题里提到的天远名下车辆车牌查询API,本质上是把“输入车牌号 -> 返回车辆基础信息”这个能力封装成…

2026/10/3 20:47:47 阅读更多 →
VRChat头像性能优化:避免“贪多”工程,打造高评分角色

VRChat头像性能优化:避免“贪多”工程,打造高评分角色

VRChat 里有一个很常见的日文词叫“よくばり”,翻译过来就是“贪多”。这个词用来形容一类头像工程再合适不过:一个人物模型里想同时塞进 4K 贴图、几十个待机动作、满身 PhysBone、粒子特效、换装部件,甚至再挂一个音乐播放器。结果往往是模…

2026/10/3 20:45:45 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →