Bash 在UNIX shell中正确拆分字符串

Bash 在UNIX shell中正确拆分字符串,bash,shell,unix,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]}" "$

我需要能够拆分一个字符串,以便每个字符串都作为变量在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
当你说:

$COMPOPT cmake ../gdcm
shell将尝试以命令的形式执行变量的值

在这种情况下,这种方法相当方便。说:

eval $COMPOPT cmake ../gdcm
当你说:

$COMPOPT cmake ../gdcm
shell将尝试以命令的形式执行变量的值

在这种情况下,这种方法相当方便。说:

eval $COMPOPT cmake ../gdcm

虽然devnull的答案有效,但使用了
eval
,这是已知的陷阱

下面是一种不调用
eval
的方法:

#!/bin/sh

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

i、 e.将整个命令行传递给
sh
(或bash)。

尽管devnull的答案有效,但使用了
eval
,并且存在已知的缺陷

下面是一种不调用
eval
的方法:

#!/bin/sh

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

i、 e.将整个命令行传递给
sh
(或bash)。

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

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

它为常用的
FOO=BAR命令
语法提供了一定程度的间接性。

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

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

它为通常的
FOO=BAR命令
语法提供了一定程度的间接性。

这比使用
eval
更安全吗?如果
$COMPOPT
设置为
rm-rf/,它仍然会被执行,不是吗?不,我从来没有说过安全问题,如果不小心,编写shell脚本也有风险。这比使用
eval
更安全吗?如果
$COMPOPT
设置为
rm-rf/,它仍然会被执行,不是吗?不,我从来没有说过安全问题,如果不小心的话,编写shell脚本是有风险的。