c++命令行参数中*的解释
Interpretation of * in command line arguments C++
我有一个c++程序,它详细描述了一组具有相同前缀的文件(即file0, file1, file2等)。当我运行程序(在linux系统上)时,我通常将前缀作为命令行参数传递:
myscript file*
详细说明(文件夹内)具有前缀文件的所有文件。c++脚本包含一个for循环,如:
for(i=1;i<argc;i++) {
//do something
}
我不是c++专家,我不知道*是如何阐述的。现在,我如何将文件子集(即从file0到file10或从file20到file35)传递给c++程序?如何使用shell命令列出文件子集?
假设您在一个类似linux的系统上运行,在执行您的程序(顺便说一下,它被称为程序,而不是脚本,因为它首先必须在执行前编译)之前,shell会对*进行评估。
所以shell展开*来匹配所有内容。这意味着您应该修改调用程序的方式,而不是修改代码。例如,File0*将匹配任何以File0开头的内容。
很可能您正在使用bash终端,在这种情况下,您应该寻找命令行帮助。GNU项目出版了一本名为"命令行介绍"的好书(http://shop.fsf.org/product/Introduction_to_Command_Line/),它在gpl下发布,免费提供。你会喜欢的。
你可能想知道你的行:for(i=2;我首先,将i设置为2,这将跳过第一个命令行参数。Argv是一个数组,其中第0个元素是命令本身,所有选项都在元素1到argc-1中。如果你有意跳过第一个参数,那也没关系。
第二个是一个非常小的操作,但是最好养成优先使用前缀自增操作(++i)而不是后缀操作的习惯。它对一个简单的整数没有影响,但在某些情况下,使用前缀操作符会产生更高效的代码(通过避免不必要的临时)。由于前缀操作符与后缀操作符一样可读,因此养成总是使用前缀操作符的习惯不会有任何损失,除非您确实需要后缀操作符。例如,在Sutter和Alexandrescu的c++编码指南的第1条(不要过早优化或悲观)中对此进行了很好的讨论。
Basile是对的,cpp程序只看到真实的文件名。传递给程序的文件名序列是shell文件名展开的结果:在包含文件a1, a1, a3, a11的目录中,像echo a[0-9]
这样的命令将导致"a1 a2 a3"。
bash没有真正的正则表达式,因此您需要通过grep管道ls命令来获取所有名为f1…F100左右(不同的数字长度)。例如:ls | egrep 'file[0-9]+'
.
程序"my_executable"将在命令行上得到类似于
的结果my_executable $(ls a* | egrep 'a[0-9]+$')
将命令放入$()中会将$()替换为该命令的输出。
- 从命令行c++发送文本文件名
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 数组长度,为什么从命令行获取时不能使用它?
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 使用 C++ 将命令行参数拆分为参数/向量
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 如何在OMNET++中添加专门的命令行参数?
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 在命令行中创建快捷命令
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- C++命令行提示符不应重复
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- c++命令行参数中*的解释