2010-05-17 42 views
3

我有一个bash脚本,它使用了一些变量(称之为$foo$bar)。眼下脚本定义他们在硬编码值上是这样的:用于解析参数的bash工具

foo=fooDefault 
bar=barDefault 

.... 

# use $foo and $bar 

我要的是能够用脚本像任何一个:

myscript    # use all defaults 
myscript -foo=altFoo # use default bar 
myscript -bar=altBar # use default foo 
myscript -bar=altBar -foo=altFoo 

理想的解决方案让我只列出我想检查标志的变量。

有没有一个合理的方法来做到这一点?


我见过getopt,我认为这可能会做什么,我正在寻找的70%左右,但我不知道是否有是建立在其上的工具或铟等是变其余的部分。

+0

getopts是迄今为止我发现的最好的。这有点特殊,但对我的需求很好。 – 2010-05-17 17:41:40

+1

你检查过http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options?看起来与你需要的相似 – bobah 2010-05-17 17:42:49

+0

@bobah:非常相关,实际上可能是我正在寻找的构件,但我正在寻找一些更专业化的东西。另外,我正在寻找一种剪切 - 粘贴解决方案,因为我现在已经足够了。 – BCS 2010-05-17 17:52:03

回答

1

您可以用eval接近做某事:

foo=fooDefault 
bar=barDefault 

for arg in "[email protected]"; do 
    eval ${arg} 
done 

此版本不带前导破折号麻烦,所以你会运行它:

myscript foo=newvalue 

这就是说,一个几个小心的话。因为我们使用eval,所以调用者可以将他们想要的任何代码/数据注入到脚本中。如果你需要你的代码是安全的,那么你必须在eval之前验证${arg}

此外,这是不是很优雅,如果你需要在你的数据空间,你将有双引号它们(一次命令行和内eval第二次):

myscript foo='"with sapces"' 
+1

grep/sed的一点乐趣可能会诀窍... – BCS 2010-05-17 18:04:01