
🔥草莓熊Lotso:个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

文章目录
- 前言:
- 一. 命令行参数:让程序接收外部输入
- 二. 环境变量:定义系统运行环境
-
- 2.1 常见环境变量及含义
- 2.2 环境变量的常用操作(终端命令)
- 2.3 关键实验:环境变量的继承特性
- 三. 代码层面操作环境变量
-
- 3.1 获取环境变量的 3 种方式
- 3.2 设置环境变量:`putenv` 函数(了解即可)
- 四. 底层原理:环境变量的组织方式
-
- 4.1 存储结构
- 4.2 继承机制
- 4.3 为什么 ./myproc 才能运行,而 ls 不用?
- 结尾:
前言:
在 Linux 开发中,命令行参数和环境变量是两个核心基础:命令行参数让程序能接收外部输入,实现灵活配置;环境变量则定义了系统运行环境,影响程序的查找路径、权限等关键行为。无论是编写脚本、开发应用,还是日常运维,掌握这两者的用法都是必备技能。本文从命令行参数的解析、环境变量的常用操作,到代码层面的获取与设置,再到底层原理,层层递进帮你吃透这些知识点,从 “会用” 升级到 “理解本质”。
一. 命令行参数:让程序接收外部输入
命令行参数是程序运行时通过终端传入的参数,比如ls -l /home中,-l和/home都是ls命令的命令行参数。它让程序无需修改代码,就能根据外部输入调整行为。
命令行参数的基本结构: C 语言程序中,命令行参数通过main函数的参数接收,标准结构如下:
#include <stdio.h>
// argc:参数个数(包含程序名本身)
// argv:字符串数组,存储具体参数(argv[0]是程序名)
int main(int argc, char *argv[]) {
printf("程序名:%s\\n", argv[0]);
printf("参数总数:%d\\n", argc);
// 遍历所有参数
for (int i = 1; i < argc; i++) {
printf("参数%d:%s\\n", i, argv[i]);
}
return 0;
}

- argc=4:包含程序名./myproc,实际传入的参数是 3 个;
- argv[0]固定为程序名,argv[1]~argv[argc-1]是用户传入的参数。
二. 环境变量:定义系统运行环境
环境变量是 Linux 系统中用来指定运行环境的参数,具有全局特性,能被子进程继承。它决定了命令查找路径、用户主目录、默认编辑器等关键行为。
2.1 常见环境变量及含义
| PATH | 指定命令的搜索路径,多个路径用 : 分隔 | /usr/bin:/bin:/usr/local/bin |
| HOME | 指定用户的主工作目录 | /home/ubuntu (普通用户)/root (root用户) |
| SHELL | 当前使用的 Shell 类型 | /bin/bash |
| USER | 当前登录用户名 | ubuntu |
| LD_LIBRARY_PATH | 动态库的搜索路径 | /usr/lib:/usr/local/lib |
提示:这些变量是系统运行和用户环境的基础配置,对于软件兼容性、权限管理和命令执行至关重要。

2.2 环境变量的常用操作(终端命令)
(1)查看环境变量
# 查看单个环境变量(推荐)
echo $PATH
echo $HOME
# 查看所有环境变量
env # 只显示环境变量
set # 显示环境变量+本地Shell变量
(2)设置环境变量
# 临时设置(仅当前终端有效,重启终端失效)
export MYENV="hello linux" # 导出为环境变量(子进程可继承)
MYENV="hello" # 仅为本地Shell变量(子进程不可继承)
# 永久设置(重启终端仍有效)
# 方法1:修改用户级配置文件(仅当前用户)
echo 'export MYENV="hello linux"' >> ~/.bashrc
source ~/.bashrc # 生效
# 方法2:修改系统级配置文件(所有用户)
sudo echo 'export MYENV="hello linux"' >> /etc/profile
source /etc/profile # 生效
(3)删除环境变量
unset MYENV # 删除环境变量MYENV

2.3 关键实验:环境变量的继承特性
环境变量的核心特性是可被子进程继承,而本地 Shell 变量不行,实验验证如下:
# 1. 定义本地Shell变量(不export)
MYENV1="local var"
# 2. 定义环境变量(export)
export MYENV2="env var"
测试程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *var1 = getenv("MYENV1");
char *var2 = getenv("MYENV2");
printf("MYENV1:%s\\n", var1 ? var1 : "未找到");
printf("MYENV2:%s\\n", var2 ? var2 : "未找到");
return 0;
}
运行结果:
结论:只有 export 导出的环境变量能被子进程继承,本地 Shell 变量不能。 
三. 代码层面操作环境变量
除了终端命令,还能通过代码获取、设置环境变量,核心依赖getenv、putenv等系统函数,以及environ全局变量。
3.1 获取环境变量的 3 种方式
(1)通过main函数的第 3 个参数
#include <stdio.h>
// env[]:环境变量数组,每个元素是"KEY=VALUE"格式
int main(int argc, char* argv[], char* env[])
{
(void)argc;
int i = 0;
for (; argv[i]; i++)
{
printf("argv[%d]: %s\\n", i, argv[i]);
}
printf("———————————-\\n");
for (int i = 0; env[i]; i++)
{
printf("env[%d]: %s\\n", i, env[i]);
}
return 0;
}
(2)通过全局变量 environ environ是 libc 定义的全局变量,指向环境变量表,无需在main函数参数中声明,但需用extern声明:
#include <stdio.h>
extern char** environ; // 声明全局环境变量表
int main()
{
// environ
int i = 0;
for (; environ[i]; i++)
{
printf("environ[%d]: %s\\n", i, environ[i]);
}
return 0;
}
(3)通过 getenv 函数(推荐) 专门获取指定环境变量,简洁高效:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("PATH: %s\\n", getenv("PATH"));
printf("HOME: %s\\n", getenv("HOME"));
printf("PWD: %s\\n", getenv("PWD"));
printf("HOSTNAME: %s\\n", getenv("HOSTNAME"));
printf("OK: %s\\n", getenv("OK")); // 获取不存在的环境变量
return 0;
}

3.2 设置环境变量:putenv 函数(了解即可)
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 设置环境变量(格式:"KEY=VALUE")
int ret = putenv("MY_TEST=123456");
if (ret != 0) {
perror("putenv failed");
return 1;
}
// 验证设置结果
char *val = getenv("MY_TEST");
if (val) {
printf("MY_TEST:%s\\n", val);
}
return 0;
}
四. 底层原理:环境变量的组织方式
4.1 存储结构
环境变量本质是一个以 NULL 结尾的字符指针数组,每个指针指向一个格式为 "KEY=VALUE" 的字符串,结构如下: 
4.2 继承机制
- 父进程创建子进程时,会讲自己的环境变量复制给子进程;
- 子进程修改环境变量不会影响父进程(复制后独立);
- export 命令的作用是将本地 Shell 变量添加到环境变量表中,使其能被后续创建的子进程继承。
4.3 为什么 ./myproc 才能运行,而 ls 不用?
核心原因就是因为 PATH 这个环境变量:
- ls命令所在的路径(/usr/bin)在PATH中,系统会自动在PATH的所有路径中查找命令;
- 自定义程序myproc不在PATH中,必须指定路径(./myproc表示当前目录)才能找到;
- 解决方法:将程序所在路径添加到PATH:
export PATH=$PATH: …………

结尾:
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:命令行参数和环境变量是 Linux 开发的 “基础基石”:命令行参数让程序更灵活,环境变量让系统环境可配置。掌握它们的用法,能让你在编写程序、日常运维时更加高效。本文覆盖了从基础用法到底层原理的核心知识点,结合实战案例帮你巩固理解。如果需要更复杂的场景,可以进一步深入学习。
✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど
