2014-12-05 22 views
5

Nelle mie impostazioni di generazione ho definire alcune macro del preprocessoreOttenere valore specifico del preprocessore macro

cioè SANDBOX_ENV = 1

voglio utilizzare il valore della SANDBOX_ENV nel mio script di shell.

ho cercato eco "SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

ma la sua dandomi tutti i valori di macro come DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1

voglio usare il valore che viene assegnato a SANDBOX_ENV

+0

Potete analizzare il valore letterale di $ {} GCC_PREPROCESSOR_DEFINITIONS? È possibile eseguire il valore letterale come comando in uno script di shell. Quindi, le corrispondenti variabili di ambiente della shell verrebbero impostate su tali valori. (non ricordo la sintassi a mano libera ...) –

+0

Non ho idea di script di shell. Cercherò di cercare i comandi. –

risposta

6

Prova questo:

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

Provi questo ... –

+1

Bello! Qualsiasi riferimento dove posso leggere di più su bash '$ {...} 'e il suo uso con l'operatore' // '? – adib

+1

man bash :) @adib nella pagina man, cercare "Parameter Expansion" per ottenere la parte corretta; $ {parametro/schema/stringa} Sostituzione del modello. Il modello è espanso per produrre un p ... –

3

Si dovrebbe essere in grado di analizzare facilmente con awk o qualcosa del genere, ma ecco come lo farei:

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

nel vostro contesto eco:

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

Fondamentalmente ho convogliato il contenuto di GCC_PREPROCESSOR_DEFINITIONS e grezza la porzione SANDBOX_ENV.

grep -P 

consiste nell'utilizzare il regex Perl \ d +, perché non mi piace POSIX. Solo una preferenza In sostanza ciò che

grep -P 'SANDBOX_ENV=\d+' 

fa è quello di trovare la linea nel contenuto convogliato ad esso che contiene la stringa "SANDBOX_ENV =" e qualsiasi numero di cifre successo esso. Se il valore potrebbe contenere caratteri alfanumerici è possibile modificare il \ d per le cifre a \ w per la parola che racchiude a-zA-Z0-9 e si ottiene:

grep -Po 'SANDBOX_ENV=\w+' 

Il + significa semplicemente ci deve essere almeno un carattere del tipo specificato dal carattere precedente, inclusi tutti i caratteri successivi che corrispondono.

il -o (solo-matching) in grep -Po viene utilizzato per isolare la corrispondenza in modo che invece dell'intera riga venga visualizzato solo "SANDBOX_ENV = 1".

Questa uscita viene quindi inviata al comando sed dove faccio una semplice ricerca e sostituzione dove ho sostituito "SANDBOX_ENV =" con "", lasciando solo il valore dietro di esso. Ci sono probabilmente modi più semplici per farlo come con awk, ma dovrai impararlo tu stesso.

+0

Non c'è bisogno di modalità perl qui. ''SANDBOX_ENV = [[: digit:]] \ +'' funzionerà senza di esso. –

+0

Questo è lo standard POSIX che ho menzionato che non mi piace. Ma sentiti libero di usarlo. :) In effetti, per sostituire il \ w si potrebbe usare [[: alnum:]]. – alienchow

+0

Oh e prendi nota che la modalità Perl regex \ w include il carattere di sottolineatura '_'. – alienchow

1

potrebbe essere la risposta ovvia, ma hai provato semplicemente:

echo ${SANDBOX_ENV} 

Se questo non funziona, prova a utilizzare eval:

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

Questo è potenzialmente pericoloso a meno che il valore di 'GCC_PREPROCESSOR_DEFINITIONS' sia sicuro. –

+0

questo non funziona in caso di macro pre processore. –

2

Se si vuole avere qualcosa di autonomo contenuto all'interno le impostazioni di compilazione e non ti importa leggera indiretta, quindi:

  1. Crea impostazioni definite dall'utente SANDBOX_ENV=1 (O qualsiasi valore che si desidera)
  2. In preprocessore macro, aggiungere SANDBOX_ENV=${SANDBOX_ENV}

nella shell, per testare, fare

echo ${SANDBOX_ENV} 

Con le impostazioni definite dall'utente, sarete ancora in grado per modificare il valore per Build Configuration and Architecture. Ad esempio, potresti fare in modo che la configurazione di Debug sia SANDBOX_ENV = 0 e Release SANDBOX_ENV = 1.

enter image description here

Problemi correlati