2010-12-11 5 views
0

10.6のXcode 3.2でHEADER_SEARCH_PATHS環境変数を解析しようとしています。私は、引数リストをループして-Iを付加して、GCCにそのすべてを渡すことができるように、私は、シェルの引用規則のすべて以下、この文字列を分割する必要がコンソールに入力した場合と同じように、文字列を引数リストに解析しますか?

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

:それはのようなパスの文字列ですこのように:

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

私はawk、sed、set、$ @、すべてを勉強しました。 1でのインクルードパスを設定し、gccのツールがあるかどうか、私も興味

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

:私はこれが働いているだろうと思った:

set -- $HEADER_SEARCH_PATHS 

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

をしかし、結果はので、それが唯一のスペースに分割しますステップ。私は何か基本的なものを欠いているに違いないありがとう!あなたは私はあなたが欲しいものを得るだろうと思いますし、システムとの最後のプリントを交換する場合

答えて

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

あなたは 'evalのセットを意味した - のいずれかを持っているだろう、この特定のケースでは...' –

+0

彼のパスは ' - 'で始まらないので働いた。しかし、 '--'を使うと助けになるだけなので追加しました。キャッチをありがとう – SiegeX

+0

こんにちは!あなたのソリューションは、これらのページに私を導いた:http://stackoverflow.com/questions/1297529/iterating-over-options-and-quoted-unquoted-arguments-passed-to-bash-scriptとhttp://stevemorin.blogspot。 com/2006/04/bash-loop-through-parameters.htmlと書かれていましたが、最終的にevalや関数を使ってソリューションを作ったので、$ 1でshiftを使っています。私は新しいので、あなたに信用を与える方法を知らないのですか? –

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のために何かを追加すると仮定すると準拠する)。

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

おそらく理想的な解決策ではありませんが、ちょっと、遅いです。

+0

Hmmmあなたのソリューションはうまくいくと思いますが、残念ながら私はperlを知らず、テストに苦労しています。私はスタック交換のために新しくなっていますので、あなたの素早い応答のために、こんにちはとお祈りしたいと思っていました。あなたの答えは、このページに到着した他の人にとって助けになるでしょう:-) –

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} 


#この機能で同じことをやっての代替例である:

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

今私はあなたが探しているものを正確に知っていますサンプルスクリプト)、私はあなたの望むものを正確に行うためにコードを更新しました。シフトを使う必要はありません。こちらをご覧くださいhttp://stackoverflow.com/questions/4414898/parse-string-into-argument-list-just-like-if-typed-into-console/4414905#4414905 – SiegeX

関連する問題