2014-12-05 13 views
5

In meinen Buildeinstellungen habe ichErhalten Sie spezifischen Wert von Präprozessormakro

heißt SANDBOX_ENV = 1

ich einige Präprozessormakros definieren will den Wert von SANDBOX_ENV in meinem Shell-Skript verwenden.

Ich habe Echo versucht "SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

aber sein gibt mir alle Makros Werte wie DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1

Ich möchte Wert verwenden, der zu SANDBOX_ENV zugeordnet

+0

Können Sie den wörtlichen Wert von $ {} GCC_PREPROCESSOR_DEFINITIONS analysieren? Sie könnten den Literalwert als Befehl in einem Shell-Skript ausführen. Dann würden die entsprechenden Shell-Umgebungsvariablen auf diese Werte gesetzt. (kann mich nicht an die Syntax aus der Hand erinnern ...) –

+0

Ich habe keine Ahnung von Shell-Skript. Wird versuchen, nach Befehlen zu suchen. –

Antwort

6

starten:

#!/bin/bash 
GCC_PREPROCESSOR_DEFINITIONS="DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1" 
# delete everything before our value ans stuff into TMPVAL 
TMPVAL="${GCC_PREPROCESSOR_DEFINITIONS//*SANDBOX_ENV=/}" 
# remove everything after our value from TMPVAL and return it 
TMPVAL="${TMPVAL// */}" 
echo $TMPVAL; #outputs 1 

HTH,

bovako

+1

Werde dies versuchen ... –

+1

Nice one! Irgendwelche Hinweise wo kann ich mehr über bash '' $ {...} 'und seine Verwendung mit dem' // 'Operator lesen? – adib

+1

man bash :) @adib in der Manpage, Suche nach "Parameter Expansion", um zum richtigen Teil zu gelangen; $ {parameter/pattern/string} Musterersetzung. Das Muster wird erweitert, um eine pat ... –

3

sollten Sie in der Lage sein, es mit awk oder etwas leicht zu analysieren, aber hier sind, wie ich es tun würde:

echo $GCC_PREPROCESSOR_DEFINITIONS | grep -Po 'SANDBOX_ENV=\d+' | sed 's/SANDBOX_ENV=//' 

In Ihrem Echo Kontext:

echo "SANDBOX value is $(echo $GCC_PREPROCESSOR_DEFINITIONS | grep -Po 'SANDBOX_ENV=\d+' | sed 's/SANDBOX_ENV=//')" 

Grundsätzlich verrohrt I den Inhalt von GCC_PREPROCESSOR_DEFINITIONS und greifte den SANDBOX_ENV-Teil aus.

grep -P 

ist die Perl regex \ d +, weil ich POSIX nicht mag. Nur eine Vorliebe. Im Wesentlichen

grep -P 'SANDBOX_ENV=\d+' 

was tut, ist die Linie in den Inhalt zu finden, um es geleitet, die die Zeichenfolge „SANDBOX_ENV =“ und eine beliebige Anzahl von Ziffern enthält nachfolgenden sie. Wenn der Wert alphanumerics enthalten könnte, kann man die \ d ändern für Ziffern w für Wort \, die a-zA-Z0-9 umfasst und Sie erhalten:

grep -Po 'SANDBOX_ENV=\w+' 

Das + bedeutet nur, da zumindest ein Zeichen sein muss, des Typs, der durch das vorhergehende Zeichen angegeben wurde, einschließlich aller nachfolgenden übereinstimmenden Zeichen.

die -o (nur-übereinstimmend) in grep -Po wird verwendet, um die Übereinstimmung zu isolieren, so dass Sie anstelle der gesamten Zeile "SANDBOX_ENV = 1" erhalten.

Dieser Ausgang wird dann zum sed-Befehl geleitet, wo ich einen einfachen Fund ersetze und ersetze, wo ich "SANDBOX_ENV =" durch "" ersetzt habe und nur den Wert dahinter belassen habe. Es gibt wahrscheinlich einfachere Möglichkeiten, es mit awk zu machen, aber das musst du selbst lernen.

+0

Hier ist kein Perl-Modus erforderlich. ''SANDBOX_ENV = [[: digit:]] \ +'' funktioniert ohne sie. –

+0

Das ist der POSIX-Standard, den ich erwähnt habe, den ich nicht mag. Aber fühlen Sie sich frei, es zu benutzen. :) Um das \ w zu ersetzen, könntest du [[: alnum:]] verwenden. – alienchow

+0

Oh, und beachten Sie, dass der Perl-Modus regex \ w den Unterstrich '_' enthält. – alienchow

1

könnte die offensichtliche Antwort, aber Sie haben einfach versucht:

echo ${SANDBOX_ENV} 

Wenn das nicht funktioniert, versuchen Sie eval:

eval "${GCC_PREPROCESSOR_DEFINITIONS}" 
echo ${SANDBOX_ENV} 
+1

Diese potentiell gefährlich ist, wenn der Wert von 'GCC_PREPROCESSOR_DEFINITIONS' garantiert sicher. –

+0

Dies funktioniert nicht bei Pre-Prozessor-Makros. –

2

Wenn Sie etwas selbst innerhalb enthalten haben wollen die Build-Einstellungen, und Sie haben nichts dagegen, leichte Umleitung, dann:

  1. Erstellen Sie benutzerdefinierte Einstellungen SANDBOX_ENV=1 (Oder was auch immer Sie gewünschten Wert)
  2. In Präprozessormakros, fügen SANDBOX_ENV=${SANDBOX_ENV}

In der Shell, zu testen, machen

echo ${SANDBOX_ENV} 

Mit den benutzerdefinierten Einstellungen, werden Sie noch in der Lage sein, Ändern des Werts für Buildkonfiguration und Architektur So könnte zum Beispiel die Debug-Konfiguration SANDBOX_ENV = 0 und Release be SANDBOX_ENV = 1 sein.

enter image description here