在UNIX shell中正确拆分字符串

时间:2014-02-11 16:58:39

标签: bash 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 个答案:

答案 0 :(得分:2)

另一个eval - 免费解决方案是使用env程序:

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

提供了通常FOO=BAR command语法的间接级别。

答案 1 :(得分:1)

当你说:

$COMPOPT cmake ../gdcm

shell会尝试将变量的值作为命令执行。

evil eval在这种情况下非常方便。说:

eval $COMPOPT cmake ../gdcm

答案 2 :(得分:1)

虽然devnull的答案有效,但使用eval并且已知存在陷阱。

这是一种可以在不调用eval的情况下完成的方式:

#!/bin/sh

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

即。将整个命令行传递给sh(或bash)。