2010-12-11 7 views
0

Ich versuche, die HEADER_SEARCH_PATHS Umgebungsvariable in Xcode 3.2 in 10.6 zu analysieren. Es ist eine Reihe von Pfaden wie:Parsen String in Argumentenliste genau wie in die Konsole eingegeben?

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

Ich brauche diese Zeichenfolge zu teilen, mit allen folgenden zitiert Regeln der Shell, so dass ich eine Schleife über die Argumentliste und prepend -I und dann all das gcc übergeben wie folgt:

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

Ich habe awk, sed, set, $ @, alles studiert. Ich dachte, das funktioniert hätte:

set -- $HEADER_SEARCH_PATHS 

for arg in [email protected] 
do 
    echo "arg $i:$arg:" >> mytestfile.txt 
    let "i+=1" 
done 

Aber es spaltet sich nur auf Platz so ist das Ergebnis:

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

ich auch neugierig bin, wenn es ein gcc-Tool, das den Pfad einschließen, in einer Sets Schritt. Ich muss etwas Grundlegendes vermissen. Danke!

Antwort

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 "[email protected]"; do 
    INCLUDE_STRING+="-I$arg " 
done 

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

meinten Sie 'eval set - ...' –

+0

in diesem speziellen Fall entweder würde gearbeitet, da seine Wege nicht mit '-' beginnen. Allerdings kann '--' nur helfen, also habe ich es hinzugefügt. Danke für den Fang – SiegeX

+0

Hey danke! Ihre Lösung führte mich zu diesen Seiten: http://stackoverflow.com/questions/1297529/iterating-over-options-and-quoted-unquoted-arguments-passed-to-bash-script und http: //stevemorin.blogspot. com/2006/04/bash-loop-through-parameters.html und ich habe schließlich eine Lösung mit eval oder eine Funktion, die dann Schicht für $ 1 verwendet und ich werde es unten posten. Ich bin neu, weiß also nicht, wie ich dir Kredit geben soll? –

0

Nicht hübsch, aber Perl ist überall ...

$ 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" 

Wenn Sie den letzten Druck mit System ersetzen, dann werden ich denke, Sie bekommen, was Sie wollen (vorausgesetzt, Sie etwas für gcc in der tatsächlich complile).

z.B.

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

Wahrscheinlich nicht die ideale Lösung, aber hey, es ist spät.

+0

Hmmm Ich denke deine Lösung würde funktionieren, leider kenne ich Perl nicht und habe es schwer es zu testen. Ich bin neu im Stack-Austausch, also wollte ich nur Hallo sagen und danke für deine schnelle Antwort, hoffentlich hilft deine Antwort anderen, die auf diese Seite kommen :-) –

0

danke für Ihre schnelle Antworten Jungs! nachdem ich darauf geschlafen habe, kam ich zu einer Lösung mit eval und shift. Der Trick ist, wenn Sie auf $ 1 zugreifen funktioniert es, aber wenn Sie über $ * oder $ @ Schleife es scheitert. Wenn jemand weiß, warum die $ 1 Shift-Methode funktioniert, kann eine Erklärung anderen helfen. Dann füge ich die vorangestellten Zeichenfolgen an eine letzte Zeichenfolge mit printf an.

#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} 


#Dies ist ein alternatives Beispiel für die gleiche Sache mit einer Funktion zu tun:

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 
+0

Jetzt weiß ich genau, wonach du suchst (nicht nur ein Beispielskript), habe ich meinen Code aktualisiert, um genau das zu tun, was Sie wollen. Es besteht keine Notwendigkeit, die Verschiebung zu verwenden. Bitte werfen Sie einen Blick hier http://stackoverflow.com/questions/4414898/parse-string-into-argument-list-just-like-if-typed-into-console/4414905#4414905 – SiegeX

Verwandte Themen