Bash 在UNIX shell中正确拆分字符串
我需要能够拆分一个字符串,以便每个字符串都作为变量在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]}" "$
$ 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脚本是有风险的。