2012-11-12 35 views
7

Tôi không muốn sử dụng tcsh, nhưng tiếc là không có lựa chọn nào trong tình huống này. Vì vậy, xin vui lòng không có "sử dụng một vỏ" câu trả lời!Làm cách nào để kiểm tra xem biến môi trường chưa được đặt hoặc được đặt thành chuỗi rỗng?

Tôi hiện đang cố gắng kiểm tra xem biến môi trường vừa được đặt chưa và cài đặt là biến có ích hay không. Vì vậy, những gì tôi muốn làm là thế này:

if ($?HAPPYVAR && $HAPPYVAR != "") then 
    ... blah... 
else if ($?SADVAR && $SADVAR != "") then 
    ... more blah ... 
endif 

Vấn đề là nếu $ HAPPYVAR là unset, nó sẽ báo lỗi ra vào nửa cuối của biểu thức (vì biến môi trường thay thế sẽ xảy ra sớm). Tôi có thể sử dụng ifs lồng nhau, nhưng sau đó tôi có vấn đề nhận được của tôi "khác" để làm việc một cách chính xác (tôi phải thiết lập một env var để nói liệu "... blah ..." đã xảy ra hay không).

Bất kỳ ai có giải pháp tốt đẹp, gọn gàng để thực hiện việc này?

+0

trong khi làm việc trên cùng một khái niệm tôi thấy rằng kịch bản của tôi không xử lý nếu khối, nó chỉ nói rằng HAPPYVAR: biến không xác định và chấm dứt, làm thế nào tôi có thể làm cho nó hoạt động để nó thực hiện nếu khối? –

Trả lời

5

Có lẽ là một cách đẹp hơn, nhưng bạn có thể sử dụng eval để trì hoãn việc thực hiện:

if ($?HAPPYVAR && {eval 'test ! -z $HAPPYVAR'}) then 
    ... blah... 
else if ($?SADVAR && {eval 'test ! -z $SADVAR'}) then 
    ... more blah ... 
endif 

Điều này dường như làm việc cho các nhu cầu của bạn.

Nếu test không hoạt động hoặc bạn, điều này sẽ làm việc quá:

if ($?HAPPYVAR && { eval 'if ($HAPPYVAR == "") exit 1' }) then 

Ah, csh.

+0

Không phải là giải pháp tao nhã tôi đã hy vọng, nhưng chắc chắn sẽ làm việc. Nếu bất cứ ai biết một giải pháp đẹp hơn, tôi là tất cả tai. – spookypeanut

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