2014-02-11 24 views
1

我需要能够拆分字符串,以便每个字符串都作为变量在我的shell中传递。正确地在UNIX shell中拆分字符串

我想是这样的:

$ cat test.sh 
#!/bin/sh 

COMPOPT="CC=clang CXX=clang++" 
$COMPOPT cmake ../gdcm 

我也试过一个bash具体的解决方案,但至今没有运气:

$ cat test.sh 
#!/bin/bash -x 

COMPOPT="CC=clang CXX=clang++" 
ARRAY=($COMPOPT) 
"${ARRAY[0]}" "${ARRAY[1]}" cmake ../gdcm 

我总是得到非知识性错误消息:

./test.sh: 5: ./t.sh: CC=clang: not found 

当然,如果我直接从运行的shell中尝试这个工程:

$ CC=clang CXX=clang++ cmake ../gdcm 

回答

3

eval另一个-free溶液是使用env程序:

env "${ARRAY[@]}" cmake ../gdm 

其提供间接通常的FOO=BAR command语法的水平。

1

当你说:

$COMPOPT cmake ../gdcm 

外壳会试图执行变量的值作为命令

在这种情况下,evileval非常方便。说:

eval $COMPOPT cmake ../gdcm 
1

尽管devnull的答案有效,但使用eval,并且有已知的陷阱。

这里是一个方式可以不调用eval来完成:

#!/bin/sh 

COMPOPT="CC=clang CXX=clang++" 
sh -c "$COMPOPT cmake ../gdcm" 

即通过整个命令行sh(或bash)。

+1

比使用'eval'更安全吗?如果'$ COMPOPT'设置为'rm -rf /; ',它仍然会被执行,不是吗? –

+0

不,我从来没有声称过安全,如果不小心的话,编写shell脚本有它自己的风险。 – anubhava