1.命令行参数
Linux 命令行参数基础
1.1参数格式
位置参数:无符号,按顺序传递(如 ls /home/user
中 /home/user
是位置参数)
选项参数:
短选项:以
-
开头,单个字母(如-l
表示长格式,-a
显示隐藏文件)。长选项:以
--
开头,完整单词(如--version
显示版本,--help
查看帮助)
1.2 常用命令示例
# 查看文件内容(带行号)
cat -n file.txt
# 复制文件并显示过程(-v 是 verbose 标志)
cp -v source.txt target.txt
# 压缩目录(-c 新建压缩包,-z gzip 压缩,-f 指定文件名)
tar -czf archive.tar.gz directory/
1.3 C 语言中获取命令行参数
在 C 语言中,通过 main
函数的参数 argc
(参数个数)和 argv
(参数数组)获取命令行参数:
#include <stdio.h>
int main(int argc, char *argv[]) {
// argc:参数总数(包含程序名本身,至少为 1)
// argv:指针数组,argv[0] 是程序名,argv[1]~argv[argc-1] 是参数
printf("程序名:%s\n", argv[0]);
printf("参数个数:%d\n", argc - 1); // 除去程序名的参数个数
// 遍历所有参数(从第 1 个开始)
for (int i = 1; i < argc; i++) {
printf("参数 %d:%s\n", i, argv[i]);
}
return 0;
}
编译与运行
# 编译
gcc main.c -o cmd_args
# 运行并传递参数
./cmd_args hello -l --test "带空格的参数"
输出结果:
程序名:./cmd_args
参数个数:4
参数 1:hello
参数 2:-l
参数 3:--test
参数 4:带空格的参数
实际上,我们输入的指令实际就是字符串,bash进程拿到之后会根据要求打断,拿到不同的小串,再做分支去执行命令。
以上是示例,总结下来这里有三个需要注意的点:
1.命令行参数至少要有一个。
2.进程对应的程序的名字一般是argv[0]。
3.有几个子串,argc就是几。
2.环境变量
2.1基本概念
2.2常见环境变量
PATH : 指定命令的搜索路径HOME : 指定⽤⼾的主⼯作⽬录(即⽤⼾登陆到Linux系统中时,默认的⽬录)SHELL : 当前Shell,它的值通常是/bin/bash 。
2.3查看环境变量方法
echo $NAME //NAME:你的环境变量名称
2.3.1 PATH
在我们执行一个自己的程序的时候为什么要用“./XXX”,而像ls,cd这些就不用?
系统中那些可直接执行的指令,Linux 下的ls
、cp
等,它们所在的目录被预先配置在了系统的PATH
环境变量中。当用户在命令行输入这些指令时,操作系统会按照PATH
环境变量中列出的目录顺序,依次查找是否存在与输入指令同名的可执行文件。由于这些指令的目录已经在PATH
中,所以操作系统能够找到并执行它们,而无需用户输入完整路径。
在 Linux 下,PATH
是一个重要的环境变量。它包含了一系列目录路径,用冒号分隔。当执行命令时,系统会按顺序在这些目录中查找对应的可执行文件,以便用户能方便地执行各种命令而无需输入完整路径。
当我们吧PATH赋值为空的时候,系统指令会失效,但是echo命令还是可以正常运行,为什么呢?
知道的小伙伴可以在评论区说说哦!!!
2.3.2 HOME
(1)⽤root和普通⽤⼾,分别执⾏ echo $HOME ,对⽐差异
- root 用户:执行
echo $HOME
会输出/root
,这是 root 用户的主目录路径。 - 普通用户:假设普通用户名为
user1
,执行echo $HOME
会输出/home/user1
,即普通用户的主目录路径。
差异原因:每个用户的 HOME
环境变量默认指向其主目录,root 和普通用户的主目录路径不同,因此输出不同
~
(波浪号)是一个 Shell 语法,表示当前用户的主目录。$HOME
是一个环境变量,存储了当前用户主目录的路径。
执行 cd ~; pwd
时:
cd ~
会切换到当前用户的主目录,等价于cd $HOME
。pwd
显示当前工作目录,输出结果与echo $HOME
一致。
关系:~
是 $HOME
的语法简写,两者均指向当前用户的主目录。
2.4和环境变量相关的命令
echo $PATH
输出当前系统的 PATH 环境变量,显示可执行文件的搜索路径。
export MY_VAR="hello world"
设置一个名为 MY_VAR 的环境变量,值为 "hello world",仅在当前 shell 会话有效。
env | less
列出当前所有环境变量,使用less
分页查看完整内容。
unset MY_VAR
删除之前设置的 MY_VAR 环境变量,之后echo $MY_VAR
将无输出
set | grep USER
列出所有本地变量和环境变量,并筛选出包含 "USER" 的条目,显示当前用户名相关变量。
2.5 环境变量的组织方式
2.6 获取环境变量
int main(int argc, char *argv[], char *env[])
这里获取的是整个环境变量的字符串。

2.通过函数获取单个环境变量
char* getenv(const char * name)
这里参数传环境变量的名字,返回环境变量对应的内容。
3.通过第三方变量environ获取
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}
效果是和上面一样的。libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时 要⽤ extern声明。
2.7 环境变量通常是具有全局属性的
我们知道,我们所开始的进程都是bash的子进程或者“孙子”进程。
这里我们提几个疑问。
那么当我们做一下操作时:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}
运行起来发现什么都没有,说明这个环境变量不存在嘛。
回到命令行输入:
export MYENV="hello world"
再次运行程序发现就有了。
(1)所以为什么呢?