2014-11-24 18 views
5

Tôi phải thực thi một hàm phải kiểm tra nếu một biến đã được xác định chính xác trong bash và phải sử dụng giá trị liên quan của nó.Làm thế nào để kiểm tra nếu một biến tồn tại và đã được khởi tạo

Ví dụ: các biến này được khởi tạo ở đầu tập lệnh.

#!/bin/bash 

var1_ID=0x04 
var2_ID=0x05 
var3_ID=0x06 
var4_ID=0x09 

Tôi muốn gọi kịch bản được đặt tên thử nghiệm như sau:

./test var1 

Chức năng thực hiện hiện nay là:

function Get() 
{ 
    if [ $1"_ID" != "" ]; then 
     echo "here" 
     echo $(($1_ID)) 
    else 
     exit 0 
    fi 
} 

Tôi không hiểu tại sao tôi có được ngay cả khi here Tôi nhập ./test toto hoặc thứ khác.

Tôi có cần sử dụng một lệnh cụ thể, chẳng hạn như grep không?

+0

Liên quan: [Làm thế nào để kiểm tra nếu một biến được định nghĩa ở tất cả trong Bash trước phiên bản 4.2 với tùy chọn trình bao nounset?] (Http://unix.stackexchange.com/a/56846/40596) – fedorqui

+1

Dường như không có ai đã tuyên bố điều này, nhưng '$ 1" _ID "' sẽ đánh giá thành '" _ID "' nếu '$ 1' không tồn tại. Và do đó sẽ luôn luôn là '! = Đến" "' –

Trả lời

8

Bạn có thể muốn sử dụng mở rộng gián tiếp: ${!variable} và sau đó -n để kiểm tra xem nó đã được xác định :

Mở rộng gián tiếp gián tiếp bao gồm gọi biến với biến khác. Tức là, vì tên biến có thể thay đổi, thay vì nói $a, chúng tôi nói ${!var}var=a.

$ cat a 
var1_ID=0x04 
var2_ID=0x05 
var3_ID=0x06 
var4_ID=0x09 

for i in {1..5}; do 
    v="var${i}_ID" 
    if [ -n "${!v}" ]; then    # <-- this expands to varX_ID 
     echo "$v set to value: ${!v}" 
    else 
     echo "$v not set" 
    fi 
done 

Nếu chúng ta thực hiện, chúng tôi nhận được:

$ ./a 
var1_ID set to value: 0x04 
var2_ID set to value: 0x05 
var3_ID set to value: 0x06 
var4_ID set to value: 0x09 
var5_ID not set 

Từ man test:

-n STRING

chiều dài của STRING là nonzero

+1

Cảm ơn bạn fedorqui. Tuy nhiên, tôi không phải là người hiểu. Điều gì có nghĩa là $ {! V}? – ogs

+0

Điều này được gọi là ** mở rộng gián tiếp **. Nó bao gồm việc gọi một biến với một biến khác. Đó là, vì tên biến có thể thay đổi, thay vì nói '$ a', chúng ta nói' $ {! Var} 'và' var = a'. Bạn có thể đọc thêm trong [bash: mở rộng gián tiếp, vui lòng giải thích?] (Http://stackoverflow.com/q/8515411/1983854). – fedorqui

+0

Thật tuyệt! Cảm ơn rất nhiều – ogs

5

Sử dụng Parameter mở rộng:

: ${var:?} 

Tháo ruột kết nếu chuỗi rỗng là một giá trị hợp lệ (ví dụ: bạn chỉ muốn kiểm tra cho definedness).

: ${var?} 

Nếu bạn không muốn kịch bản để dừng lại trên vấn đề, bạn có thể sử dụng

if [[ ${var:+1} ]] ; then 
    # OK... 
else 
    echo Variable empty or not defined. >&2 
fi 
3

Trong bash 4.2, bạn có thể sử dụng toán tử -v trong biểu thức điều kiện để kiểm tra xem biến có tên đã cho được đặt hay chưa.

if [[ -v ${1}_ID ]]; then 
    echo "${1}_ID is set" 
    foo=${1}_ID 
    echo "${!foo}" 
fi 

Bạn vẫn cần mở rộng tham số gián tiếp để nhận giá trị.

Trong bash 4.3 bạn có thể sử dụng tham chiếu có tên để làm việc với nó dễ dàng hơn.

declare -n param=${1}_ID 
if [[ -v param ]]; then 
    echo "${1}_ID" 
    echo "$param" 
fi 

(param sẽ y hệt như biến nó tham chiếu. Tôi không biết nếu có một cách dễ dàng, viết tắt của phân tích đầu ra của declare -p param, để có được tên của nó tài liệu tham khảo khác nhau.)

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