2014-12-05 12 views
5

Ở các cơ sở xây dựng của tôi có định nghĩa một số macro PreprocessorNhận giá trị cụ thể của tiền xử lý vĩ mô

ví dụ SANDBOX_ENV = 1

Tôi muốn sử dụng giá trị của SANDBOX_ENV trong shell script của tôi.

Tôi đã thử vang "SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

nhưng nó đem lại cho tôi tất cả các giá trị macro như DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1

Tôi muốn sử dụng giá trị được gán cho SANDBOX_ENV

+0

Bạn có thể phân tích giá trị bằng chữ của $ {GCC_PREPROCESSOR_DEFINITIONS} không? Bạn có thể thực thi giá trị bằng chữ như một lệnh trong một kịch bản lệnh shell. Sau đó, các biến môi trường shell tương ứng sẽ được đặt thành các giá trị đó. (không thể nhớ cú pháp tắt tay ...) –

+0

Tôi không có ý tưởng về kịch bản lệnh shell. Sẽ cố gắng tìm kiếm các lệnh. –

Trả lời

6

Hãy thử điều này:

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

Sẽ thử cái này ... –

+1

Đẹp nhất! Bất kỳ tài liệu tham khảo nào tôi có thể đọc thêm về bash ''$ {...}' và việc sử dụng nó với toán tử '//'? – adib

+1

man bash :) @adib trong trang người đàn ông, tìm kiếm "Mở rộng tham số" để đến đúng phần; $ {tham số/mẫu/chuỗi} Thay thế mẫu. Các mô hình được mở rộng để sản xuất một pat ... –

3

Bạn sẽ có thể phân tích nó một cách dễ dàng với awk hoặc một cái gì đó, nhưng đây là cách tôi muốn làm điều đó:

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

Trong bối cảnh âm vang của bạn:

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

Về cơ bản tôi đường ống nội dung của GCC_PREPROCESSOR_DEFINITIONS và grepped ra phần SANDBOX_ENV.

grep -P 

là sử dụng chế độ Perl \ d +, vì tôi không thích POSIX. Chỉ là một sở thích. Về cơ bản, những gì

grep -P 'SANDBOX_ENV=\d+' 

thực hiện tìm dòng trong nội dung có chứa đường dẫn chứa chuỗi "SANDBOX_ENV =" và bất kỳ số chữ số nào thành công. Nếu giá trị có thể chứa chữ cái và số bạn có thể thay đổi \ d cho chữ số \ w cho chữ trong đó bao gồm a-zA-Z0-9 và bạn nhận được:

grep -Po 'SANDBOX_ENV=\w+' 

Các + chỉ có nghĩa là phải có ít nhất một ký tự của loại được chỉ định bởi ký tự trước nó, bao gồm tất cả các ký tự thành công phù hợp.

-o (chỉ phù hợp) trong grep -Po được sử dụng để cô lập kết quả phù hợp để thay vì toàn bộ dòng bạn chỉ nhận được "SANDBOX_ENV = 1".

Đầu ra này sau đó được chuyển đến lệnh sed nơi tôi thực hiện tìm và thay thế đơn giản nơi tôi đã thay thế "SANDBOX_ENV =" bằng "", chỉ để lại giá trị đằng sau nó. Có thể có những cách dễ dàng hơn để làm điều đó giống như với awk, nhưng bạn sẽ phải học rằng chính mình.

+0

Không cần cho chế độ perl ở đây. ''SANDBOX_ENV = [[: chữ số:]] \ +'' sẽ hoạt động mà không có nó. –

+0

Đó là tiêu chuẩn POSIX mà tôi đã đề cập đến mà tôi không thích. Nhưng hãy sử dụng nó. :) Trong thực tế, để thay thế \ w bạn có thể sử dụng [[: alnum:]]. – alienchow

+0

Oh và lưu ý rằng chế độ Perl regex \ w bao gồm dấu gạch dưới '_'. – alienchow

1

Có thể là câu trả lời rõ ràng, nhưng đã bạn chỉ đơn giản là cố gắng:

echo ${SANDBOX_ENV} 

Nếu điều đó không làm việc, hãy thử sử dụng eval:

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

Điều này có khả năng nguy hiểm trừ khi giá trị của 'GCC_PREPROCESSOR_DEFINITIONS' được đảm bảo an toàn. –

+0

tính năng này không hoạt động trong trường hợp các macro xử lý trước. –

2

Nếu bạn muốn có một cái gì đó khép kín trong vòng cài đặt Xây dựng và bạn không nhớ chút gián tiếp, sau đó:

  1. Tạo cài đặt User-Defined SANDBOX_ENV=1 (Hoặc bất kỳ giá trị mà bạn muốn)
  2. Trong Preprocessor Macros, thêm SANDBOX_ENV=${SANDBOX_ENV}

Trong shell của bạn, để kiểm tra, làm

echo ${SANDBOX_ENV} 

Với User Settings-Defined, bạn vẫn sẽ có thể để sửa đổi giá trị cho cấu hình xây dựng và kiến ​​trúc. Vì vậy, ví dụ, bạn có thể làm cho cấu hình Debug là SANDBOX_ENV = 0 và Release là SANDBOX_ENV = 1.

enter image description here

Các vấn đề liên quan