写给npy的博客 | 命令行参数简介
命令行是日常生产中必须要掌握的一项技能。
当然,现代人基本都可以通过GUI活下去,但是掌握命令行的基本操作也是必不可少的,同时对命令行的基本操作也应该有所熟悉。
C语言命令行参数
被忽略的main函数参数
C语言中的主函数为main函数,一般在写题目时从来不会注意main函数的参数问题,且大多数情况都是忽略的。也就是
#include<stdio.h>
int main()
{
//不写了
;
}
实际上main函数也有参数。原型是
int main(int argc, char ** argv)
,其中第二个参数可以是char** argv
或char * argv[])
或char argv[][]
。
Example
以下面这段程序作为例子解释其中参数的含义
#include<stdio.h>
int main(int argc, char ** argv)
{
printf("the argument count is %d\n", argc);
for (int i = 0; i < argc;i++)
{
printf("#%d\t%s\n", i, argv[i]);
}
}
编译生成.exe文件 在命令行中测试有如下结果:
PS ..> .\test.exe 1 2 3 4 hhhhh "wwow www" onmygod
the argument count is 8
#0 D:\Code\C\Test\test.exe
#1 1
#2 2
#3 3
#4 4
#5 hhhhh
#6 wwow www
#7 onmygod
可以发现第一个参数数量包括了运行的脚本,且第一个参数即是启动脚本的名称。即脚本后面跟随的参数下标便从1开始而不是0,另外两个参数之间通过空格隔开,但是如果想要输入的参数之中包含空格,则应该用""
括起来,例如上面例子中的#6。
Python中的命令行参数
我有时会用Python写一些脚本来辅助我编程,比如爬取校园网上的视频、一键大写(写汇编的时候可能会用到,但是最后发现Vscode自带这个功能😑)、清理某个文件夹下的xxx.xxx文件(哦,这个只是因为我不太擅长正则表达式吧)
Python中的命令行参数借助sys库来使用,即sys.argv
。
Example
import sys
print("sys.argv 类型:",type(sys.argv))
print("sys.argv中元素类型:",type(sys.argv[0]))
print("命令行参数个数为:",len(sys.argv))
for i in range(len(sys.argv)):
print(f"#{i}\t{sys.argv[i]}")
通过命令行启动Python脚本如下
PS ..> python .\temp.py 1 2 3 4 hhhh "this is a test \n" onmygod
sys.argv 类型: <class 'list'>
sys.argv中元素类型: <class 'str'>
命令行参数个数为: 8
#0 .\temp.py
#1 1
#2 2
#3 3
#4 4
#5 hhhh
#6 this is a test \n
#7 onmygod
同样如C中所示,只不过这里便没有了argc
这个参数,且数据的类型也不一样了,sys.argv
是列表类型,长度可以通过len()
函数来确定。
Shell中的传递参数
在shell脚本语言中,命令行参数常被叫做传递参数,语法是类似的,但注意对于参数中存在空格的情况,仍然要用""
扩起来。具体如何使用请看下表。
参数 | 含义 |
---|---|
$# | 是传给脚本的参数个数 |
$0 | 是脚本本身的名字(与c语言中类似) |
$1 | 是传递给该shell脚本的第一个参数 |
$2 | 是传递给该shell脚本的第二个参数 |
$@ | 是传给脚本的所有参数的列表 |
$* | 是以一个单字符串显示所有传递的参数,与位置变量不同,参数可超过9个 |
$$ | 是脚本运行的当前进程ID号 |
$? | 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 |
注意,
$@
和$*
均代表了所有的参数,但是其类型不一样,前者指参数列表,而后者是将传递进来的参数合并成一个字符串所显示的内容。
Example
#!/bin/bash
echo 我是$0,PID是$$,我接受了$#个参数
echo 所有参数是$*
echo 第一种写法
for arg in $@ #×(不能识别带空格的参数)
do
echo 参数是$arg
done
echo 第二种写法
for arg in "$@" #√
do
echo 参数是$arg
done
bash
运行结果如下
$ bash ./test.sh 1 2 "thi is a test" onmygod
我是./test.sh,PID是1927,我接受了4个参数
所有参数是1 2 thi is a test onmygod
第一种写法
参数是 1
参数是 2
参数是 thi
参数是 is
参数是 a
参数是 test
参数是 onmygod
第二种写法
参数是 1
参数是 2
参数是 thi is a test
参数是 onmygod
碎碎念
实际上看了C语言的命令行参数,再联系联系平常使用一些工具的场景,FFmpeg
、ipconfig
、rm
……类似这些命令行工具,后面都能接受参数,本质上都是一样的,只不过经过了各种语言改变后,有了不同的用法。最核心的是shell
,但其实shell
底层也是C
写的,仍然可以看成是一直在操作系统中运行的C语言程序。
Refer&Thank
Supported By everything411
请各位看官不吝赐教!
欢迎访问我的博客ZoroGH's Github Page