2014-12-05 20 views
5

W moich ustawieniach kompilacji mam zdefiniować kilka makr preprocesoraaby otrzymać wartość preprocesora makro

tj SANDBOX_ENV = 1

chcę użyć wartości SANDBOX_ENV w moim skrypcie.

Próbowałem echo "SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

ale jego dając mi wszystkie wartości makra jak DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1

chcę użyć wartości, która jest przypisana do SANDBOX_ENV

+0

można analizować dosłowne wartości $ {GCC_PREPROCESSOR_DEFINITIONS}? Można wykonać literalną wartość jako polecenie w skrypcie powłoki. Następnie odpowiednie zmienne środowiskowe powłoki zostaną ustawione na te wartości. (nie pamiętam składni off strony ...) –

+0

Nie mam pojęcia o skrypcie powłoki. Spróbuje wyszukać polecenia. –

Odpowiedz

6

Spróbuj:

#!/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

Spróbuję tego ... –

+1

Niezły! Wszelkie odniesienia, gdzie mogę przeczytać więcej na bash '' $ {...} 'i jego użycie z operatorem' // '? – adib

+1

man bash :) @adib na stronie man, wyszukaj "Rozszerzenie parametrów", aby dostać się do właściwej części; $ {parametr/wzór/ciąg} Podstawienie wzoru. Wzorzec jest rozwinięty w celu wygenerowania pat ... –

3

powinny być zdolne do analizowania go łatwo z awk czy coś, ale oto jak zrobiłbym to:

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

W swojej echa kontekstu:

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

Zasadniczo rurami zawartość GCC_PREPROCESSOR_DEFINITIONS i wyodrębniona część SANDBOX_ENV.

grep -P 

należy użyć wyrażenia regularnego Perla \ d +, ponieważ nie lubię POSIX. Tylko preferencja. Zasadniczo co

grep -P 'SANDBOX_ENV=\d+' 

nie jest znalezienie linia w treści rurami o to, że zawiera ciąg „SANDBOX_ENV =” i dowolną liczbę kolejnych cyfr go. Jeżeli wartość może zawierać znaki alfanumeryczne można zmienić \ d dla cyfry do \ W za słowa, które obejmuje a-zA-0-9 i masz:

grep -Po 'SANDBOX_ENV=\w+' 

Znak + oznacza po prostu musi istnieć co najmniej jeden znak typu określonego przez poprzedzający go znak, w tym wszystkie pasujące do siebie znaki, które pasują.

-o (tylko dopasowanie) w grep -Po służy do odizolowania dopasowania tak, że zamiast całej linii pojawia się "SANDBOX_ENV = 1".

Dane wyjściowe są następnie przesyłane do komendy sed, gdzie wykonuję proste wyszukiwanie i zastępuję miejsce, w którym zastąpiłem "SANDBOX_ENV =" symbolem "", pozostawiając za sobą tylko wartość. Są prawdopodobnie łatwiejsze sposoby na to, jak w awk, ale musisz się tego nauczyć.

+0

Nie ma potrzeby trybu perl tutaj. ''SANDBOX_ENV = [[: digit:]] \ +" 'zadziała bez niego. –

+0

To standard POSIX, o którym wspominałem, którego nie lubię. Ale możesz z niego korzystać. :) W rzeczywistości, aby zastąpić \ w można użyć [[: alnum:]]. – alienchow

+0

Aha i zauważ, że tryb Perge regex \ w zawiera podkreślenie "_". – alienchow

1

Może być oczywista odpowiedź, ale po prostu próbowałem:

echo ${SANDBOX_ENV} 

Jeśli to nie zadziała, spróbuj użyć eval:

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

Jest to potencjalnie niebezpieczne, chyba że wartość 'GCC_PREPROCESSOR_DEFINITIONS' jest bezpieczna. –

+0

nie działa to w przypadku makr pre-procesora. –

2

Jeśli chcesz mieć coś autonomiczny wewnątrz Ustawienia kompilacji i nie przeszkadza ci niewielkie niedomaganie, a następnie:

  1. Tworzenie ustawień zdefiniowanych przez użytkownika SANDBOX_ENV=1 (Lub niezależnie od wartości chcesz)
  2. W makr preprocesora, dodać SANDBOX_ENV=${SANDBOX_ENV}

W swojej skorupy, aby sprawdzić, czy

echo ${SANDBOX_ENV} 

z Ustawienia zdefiniowane przez użytkownika, nadal będziesz w stanie zmodyfikować wartość dla konfiguracji konfiguracji i architektury. Na przykład, możesz ustawić konfigurację debugowania na SANDBOX_ENV = 0 i Release be SANDBOX_ENV = 1.

enter image description here