写给npy的博客 | 命令行参数简介

234 阅读4分钟

写给npy的博客 | 命令行参数简介

ZoroGH

命令行是日常生产中必须要掌握的一项技能。

当然,现代人基本都可以通过GUI活下去,但是掌握命令行的基本操作也是必不可少的,同时对命令行的基本操作也应该有所熟悉。

C语言命令行参数

被忽略的main函数参数

C语言中的主函数为main函数,一般在写题目时从来不会注意main函数的参数问题,且大多数情况都是忽略的。也就是

#include<stdio.h>
int main()
{
//不写了
;
}

实际上main函数也有参数。原型是 int main(int argc, char ** argv),其中第二个参数可以是char** argvchar * 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语言的命令行参数,再联系联系平常使用一些工具的场景,FFmpegipconfigrm……类似这些命令行工具,后面都能接受参数,本质上都是一样的,只不过经过了各种语言改变后,有了不同的用法。最核心的是shell,但其实shell底层也是C写的,仍然可以看成是一直在操作系统中运行的C语言程序。

Refer&Thank

  1. C语言命令行参数 | 菜鸟教程
  2. shell和c语言的区别
  3. Python 处理命令行参数
  4. Shell 传递参数 | 菜鸟教程

Supported By everything411


请各位看官不吝赐教!

欢迎访问我的博客ZoroGH's Github Page