2012-12-24 21 views
5

Trước khi tôi chạy kịch bản tôi đã nhậpBash Script đang trở lại đúng đối với cả hai nhưng chuỗi đối diện thử nghiệm

# export CPIC_MAX_CONV=500 

Sau đây là các tập tin test1.script

#!/bin/bash 

function cpic() { 
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`" 
    [[ $var=="" ]] && (echo "Empty String <<") 
    [[ $var!="" ]] && (echo "$CPIC_MAX_CONV") 
    echo "$var" ; 
} 

cpic 

Đầu ra là:

# test1.script ---- Me running the file 

Empty String << 
500 
CPIC_MAX_CONV="500" 

Không có vấn đề gì tôi sử dụng "" hoặc '' hoặc [hoặc [[kết quả giống nhau. Biến số CPIC_MAX_CONV được tìm thấy bởi tập lệnh trên.

Tôi đang chạy tính năng này trên Linux/CentOS 6.3.

Ý tưởng rất đơn giản: Để tìm hiểu xem CPIC_MAX_CONV được xác định trong môi trường và trả về giá trị của nó hay chưa. Nếu một không gian trống là có thì dĩ nhiên biến không có trong hệ thống.

Trả lời

4

Tại sao bạn luôn nhận được sự thật? Hãy chơi một chút trong thiết bị đầu cuối của bạn trước tiên:

$ [[ hello ]] && echo "True" 

Bạn nghĩ đầu ra là gì? (thử nó!) Và với những điều sau đây?

$ [[ "" ]] && echo "True" 

(dùng thử!).

Tất cả các quyền, vì vậy có vẻ như một chuỗi không trống tương đương với biểu thức đúng, và một chuỗi rỗng (hoặc một biến chưa đặt) tương đương với biểu thức sai.

gì bạn đã làm như sau:

[[ $var=="" ]] 

[[ $var!="" ]] 

vì vậy bạn đã đưa ra một chuỗi không trống, đó là sự thật!

Để thực hiện việc kiểm tra, bạn thực sự cần không gian giữa các thẻ:

[[ $var == "" ]] 

thay. Bây giờ, thử nghiệm của bạn sẽ được viết tốt hơn là:

if [[ -z "$var" ]]; then 
    echo "Empty String <<" 
else 
    echo "$CPIC_MAX_CONV" 
fi 

(không có vỏ con và chỉ với một thử nghiệm).

Có nhiều điều để nói về kiểu kịch bản của bạn. Không có hành vi phạm tội, tôi sẽ nói rằng điều đó thực sự tồi tệ:

  • Không sử dụng backticks! Thay vào đó hãy sử dụng cấu trúc $(...). Do đó:

    var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')" 
    
  • Không sử dụng function blah để xác định hàm.Chức năng của bạn nên đã được định nghĩa là:

    cpic() { 
        local var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')" 
        if [[ -z "$var" ]]; then 
         echo "Empty String <<" 
        else 
         echo "$CPIC_MAX_CONV" 
        fi 
    } 
    

Ồ, tôi sử dụng các từ khóa local, bởi vì tôi đoán bạn sẽ không sử dụng biến var bên ngoài của hàm cpic.

Bây giờ, mục đích của hàm cpic là gì và cụ thể là những thứ bạn đang xác định biến var? Nó sẽ rất khó để mô tả (như có rất nhiều trường hợp bạn đã không nghĩ đến). (Btw, grep của bạn có vẻ thực sự vô dụng ở đây). Dưới đây là một vài trường hợp, bạn bỏ qua:

  • Một biến xuất khẩu được đặt tên somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
  • Một xuất khẩu biến chứa chuỗi CPIC_MAX_CONV nơi nào đó, ví dụ:

    export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here" 
    

Ok, tôi don' t muốn mô tả những gì dòng của bạn đang làm chính xác, nhưng tôi loại đoán rằng mục đích của bạn là để biết liệu biến CPIC_MAX_CONV được thiết lập và đánh dấu để xuất khẩu, phải không? Trong trường hợp đó, bạn sẽ tốt hơn chỉ với điều này:

cpic() { 
    if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then 
     echo "Empty String <<" 
    else 
     echo "$CPIC_MAX_CONV" 
    fi 
} 

Nó sẽ hiệu quả hơn và mạnh mẽ hơn nhiều.

Oh, tôi bây giờ chỉ cần đọc hết bài viết của bạn. Nếu bạn muốn chỉ cho biết nếu biến CPIC_MAX_CONV được thiết lập (đối với một số giá trị không trống - có vẻ như bạn không quan tâm nếu nó được đánh dấu để xuất khẩu hay không, chính xác cho tôi nếu tôi sai), nó thậm chí còn đơn giản hơn (và nó sẽ hiệu quả hơn nhiều):

cpic() { 
    if [[ "$CPIC_MAX_CONV" ]]; then 
     echo "Empty String <<" 
    else 
     echo "$CPIC_MAX_CONV" 
    fi 
} 

cũng sẽ hoạt động!

+0

Tôi nghĩ của 'if' như là một lệnh. Mọi thứ sau đây là các đối số được phân tách bằng dấu cách, giống như bất kỳ lệnh nào khác. –

+0

@BarryBrown Để chính xác, 'if' là một từ khóa:' type if' trả về 'if là một từ khóa shell'. –

+0

Tại sao không sử dụng từ khóa 'function'? –

1

Bạn có thực sự quan tâm cho dù CPIC_MAX_CONV là một biến môi trường so với chỉ 'nó là một biến mà có thể là một biến môi trường'? Nhiều khả năng, bạn sẽ không, ít nhất vì nếu nó là biến nhưng không phải biến môi trường, bất kỳ tập lệnh nào bạn chạy sẽ không thấy giá trị (nhưng nếu bạn nhấn mạnh vào sử dụng bí danh và hàm, thì nó có thể quan trọng, nhưng vẫn có lẽ sẽ không).

Nó xuất hiện, sau đó, rằng bạn đang cố gắng để kiểm tra xem CPIC_MAX_CONV được đặt thành một giá trị không trống. Có nhiều cách dễ dàng để làm điều đó - và sau đó là cách bạn đã thử.

: ${CPIC_MAX_CONV:=500} 

Điều này đảm bảo CPIC_MAX_CONV được đặt thành giá trị không trống; nó sử dụng 500 nếu trước đó không phải là một bộ giá trị. Lệnh : (dấu hai chấm) đánh giá các đối số và báo cáo thành công của nó. Bạn có thể sắp xếp để xuất biến sau khi biến được tạo nếu bạn muốn với export CPIC_MAX_CONV.

Nếu bạn phải có bộ biến (không có mặc định phù hợp), sau đó bạn sử dụng:

: ${CPIC_MAX_CONV:?} 

hoặc

: ${CPIC_MAX_CONV:?'The CPIC_MAX_CONV variable is not set but must be set'} 

Sự khác biệt là bạn có thể sử dụng thông điệp mặc định (' CPIC_MAX_CONV: tham số null hoặc không được đặt ') hoặc chỉ định của riêng bạn.

Nếu bạn chỉ sẽ sử dụng giá trị một lần, bạn có thể làm một 'trên bay' thay thế trong một lệnh với:

cpic_command -c ${CPIC_MAX_CONV:-500} ... 

này không tạo ra các biến nếu nó không tồn tại, không giống như ký hiệu :=.

Trong tất cả các ký hiệu này, tôi đã sử dụng dấu hai chấm như một phần của thao tác. Điều đó thực thi 'null hoặc không được đặt'; bạn có thể bỏ qua dấu hai chấm, nhưng điều đó cho phép một chuỗi trống dưới dạng giá trị hợp lệ, có lẽ không phải là những gì bạn muốn. Lưu ý rằng một chuỗi bao gồm chỉ một ô trống là 'không trống'; nếu bạn cần xác nhận rằng bạn đã có một chuỗi không trống, bạn phải làm việc chăm chỉ hơn một chút.


Tôi không giải thích sự lạm dụng của bạn về lệnh [[; gniourf_gniourf đã cung cấp một số tuyệt vời deconstruction trong số đó, nhưng bỏ qua các ký hiệu đơn giản có sẵn để làm những gì có vẻ là công việc.

+0

Điểm tốt! '+ 1' –

-1

Bạn cần khoảng trắng trong điều kiện của mình.

#!/bin/bash 

function cpic() { 
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`" 
    [[ $var == "" ]] && (echo "Empty String <<") 
    [[ $var != "" ]] && (echo "$CPIC_MAX_CONV") 
    echo "$var" ; 
} 

cpic 
+0

Tôi không chắc câu trả lời của bạn có thêm bất cứ điều gì xen kẽ vào những cái khác không. Bên cạnh đó, bạn để lại tất cả những sai lầm mà OP có (sử dụng backticks, sử dụng subshells vô ích, sử dụng 'grep', sử dụng từ khóa' function' không được dùng nữa, có thể không phải là thuật toán tốt nhất để đạt được những gì anh ta cố gắng đạt được). '-1'. –

+0

Không phạm tội, nhưng tôi đã trả lời chủ đề của câu hỏi. OP không hỏi về các phương pháp mã hóa tốt nhất ở đây. –

+0

Không phạm tội. Sau đó, ít nhất _explain_ tại sao người hỏi có được kết quả khá khó hiểu này. –

0

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

#!/bin/bash 
function cpic() {  
    var="`export | grep -i "CPIC_MAX_CONV"`" 
    [ "$var" = "" ] && (echo "Empty String <<") 
    [ "$var" != "" ] && echo "$CPIC_MAX_CONV" 
} 
cpic 
+0

Điểm quan trọng trong việc trả lời câu hỏi và không cung cấp bất kỳ thông tin mới nào? –