我正在使用Ubuntu并提升v1.50。
以前我使用boost program_options将一组选项提供给一个程序,如下所示:
#!/bin/bash
./prog --arg1 1 --arg2 "2" --arg3 {1,2,3} --arg4 {1,2} --arg5 5
所以我正在处理单个整数,字符串和整数数组的混合。 这很好。
但是,在通过在bash中引入局部变量来“改进”代码之后,我有:
#!/bin/bash
a1=1
a2="2"
a3={1,2,3}
a4={1,2}
a5=5
./prog --arg1 $a1 --arg2 $a2 --arg3 $a3 --arg4 $a4 --arg5 $a5
执行此操作会导致错误:
error: the argument ('{1,2,3}') for option '--arg3' is invalid
我已经设置了这样的boost program_options:
namespace po = boost::program_options;
using namespace std;
try{
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("arg1", po::value<int>(&arg1)->required(), "doc1")
("arg2", po::value<string>(&arg2)->default_value("test"), "doc2")
("arg3", po::value<vector<int> >(&arg3)->multitoken(), "doc3")
("arg4", po::value<vector<int> >(&arg4)->multitoken(), "doc4")
("arg5", po::value<int>(&arg5)->default_value(1), "doc5")
;
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);
if(vm.count("help")) cout << desc << "\n";
}
catch(exception& e){
cerr << "error: " << e.what() << "\n";
errorflag=1;
}
catch(...){
cerr << "Exception of unknown type!\n";
errorflag=1;
}
我哪里出错了?多声道在这种情况下不合适吗?我可以用什么呢?是不是可以读取整数数组?
我尝试省略多音,但后来也失败了。 在bash脚本中使用局部变量周围的引号也无济于事。
如果我将数组输入从{a,b,c}更改为“a b c”,则可以。但是,我已经有了大量的其他格式的条目,我想继续使用它,因为其他程序也依赖它。
我认为它应该是可行的,因为它没有局部变量。有人知道吗?
编辑:我错了。 “a b c”不能作为输入:( 编辑2:我提出了一些解决方法: 我转换{a,b,c} - &gt; a b c使用argnew=`echo ${arg:1:-1} | tr ',' ' '`
并将其提供给程序正常。这是最好的解决方案吗?
答案 0 :(得分:0)
更改原始脚本以添加-x
bash调试选项,如下所示:
#!/bin/bash -x
./prog --arg1 1 --arg2 "2" --arg3 {1,2,3} --arg4 {1,2} --arg5 5
然后运行它显示此输出:
+ ./prog --arg1 1 --arg2 2 --arg3 1 2 3 --arg4 1 2 --arg5 5
所以你的大括号分组并不是你认为他们正在工作的方式,因为bash命令行处理在调用./prog
之前扩展它们。
如果您在第二个脚本中更改了a3
和a4
的分配,则可以使其正常工作:
a3='1 2 3'
a4='1 2'
然后在致电./prog
时双引所有变量:
./prog --arg1 "$a1" --arg2 "$a2" --arg3 "$a3" --arg4 "$a4" --arg5 "$a5"