将字符串解析为参数列表就像输入控制台一样?

时间:2010-12-11 02:38:11

标签: string list shell split arguments

我正在尝试解析10.6中Xcode 3.2中的HEADER_SEARCH_PATHS环境变量。这是一串路径,如:

"~/My Path with Spaces" /usr/local /myrootpath

我需要按照所有shell的引用规则拆分这个字符串,这样我就可以遍历参数列表并预先添加-I然后将所有这些传递给gcc,如下所示:

gcc -I"~/Path with Spaces" -I/usr/local -I/myrootpath

我研究过awk,sed,set,$ @,一切。我认为这会奏效:

set -- $HEADER_SEARCH_PATHS

for arg in $@  
do  
    echo "arg $i:$arg:" >> mytestfile.txt  
    let "i+=1"  
done  

但它只在空间上分裂,结果是:

arg :"~/Path:  
arg 1:with:  
arg 2:Spaces":  
arg 3:/usr/local:  
arg 4:/myrootpath:

如果有一个gcc工具可以在一个步骤中设置包含路径,我也很好奇。我必须遗漏一些基本的东西。感谢名单!

3 个答案:

答案 0 :(得分:0)

#!/bin/bash

OTHER_LINKER_FLAGS="-L/usr/lib -lfoo"
GCC_PREFIX_HEADER="blah"
HEADER_SEARCH_PATHS="\"/path with spaces\" /usr/include /home/user/includes"

eval set -- $HEADER_SEARCH_PATHS

for arg in "$@"; do
  INCLUDE_STRING+="-I$arg "
done

g++ ${INCLUDE_STRING} ${OTHER_LINKER_FLAGS} -c ${GCC_PREFIX_HEADER}

答案 1 :(得分:0)

不漂亮,但perl无处不在......

$ cat prep.pl 
#!/usr/bin/perl

while ($#ARGV>=0) {
print " -I\"";
print shift;
print "\"";
}

$ echo $A
"a b c" x y

$ perl -e '$cmd="./prep.pl ".$ENV{"A"}; $args= `$cmd`; print("gcc ".$args);'
gcc  -I"a b c" -I"x" -I"y"

如果用系统替换最后一个打印件,那么我认为你会得到你想要的东西(假设你为gcc添加一些东西以实际压缩)。

e.g。

$ perl -e '$cmd="./prep.pl ".$ENV{"A"}; $args= `$cmd`; system("gcc ".$args." 1.c");'

可能不是理想的解决方案,但嘿,已经很晚了。

答案 2 :(得分:0)

thanx为你快速反应的人! 在睡觉之后,我使用eval和shift来解决问题。 诀窍是,如果你访问$ 1它可以工作,但如果你循环$ *或$ @它失败。 如果有人知道为什么$ 1转换方法有效,解释可能会帮助其他人。 然后我将前置的字符串附加到带有printf的最终字符串。

#this script will create a prefix.h.gch precompiled
#header in the project's directory.

cd "${PROJECT_DIR}"

eval set -- $HEADER_SEARCH_PATHS

HEADER_SEARCH_STRING=""  
while [ $# -gt 0 ]; do  
    HEADER_SEARCH_STRING=HEADER_SEARCH_STRING printf %s "-I\"$1\" "  
    shift  
done

g++ ${HEADER_SEARCH_STRING} ${OTHER_LINKER_FLAGS} -c ${GCC_PREFIX_HEADER}


    #this是使用函数执行相同操作的另一个示例:

TESTVAR="\"hello there\" a b /my/path"

TOKENS=""  
function tokenize {  
    while [ $# -gt 0 ]; do  
        TOKENS=TOKENS printf %s "-I\"$1\" "  
        #TOKENS=TOKENS echo "-I\""$1"\""  
        #echo "$1"  
        shift  
    done  
}

eval tokenize $TESTVAR

echo $TOKENS