2015-07-01 23 views
6

Tôi hy vọng sẽ sử dụng biến bên dưới trong tập lệnh bash của tôi nhưng trong trường hợp nếu giá trị này trống hoặc rỗng thì cách nào tốt nhất để xử lý và thoát khỏi tập lệnh.Shell script - thoát script nếu biến là null hoặc rỗng

tag=$1 

Tôi thấy câu trả lời với 'đặt -u'. Tôi biết điều này sẽ làm việc nhưng điều này tốt cho môi trường sản xuất?

+1

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29 –

+0

nên một biến bao gồm khoảng trắng chỉ như thế này: 'var =" "' được coi trống rỗng hay không? –

+0

có, biến bao gồm khoảng trắng, được xem là trống. về cơ bản, tôi đang nghĩ để đặt một tờ séc như thể [[! -z "$ {Tag}" && "$ {Tag}"! = ’’]] cho việc này. –

Trả lời

17

Có một toán tử tích hợp để yêu cầu một biến được đặt. Điều này sẽ khiến cho tập lệnh thoát ra nếu không.

tag=${1?Need a value} 

Thường thì điều này được sử dụng với : no-op gần đầu tập lệnh.

: ${1?Need a value} 

Lạm phát "không được đặt hoặc trống" hơi khác. Không có cấu trúc tương tự để thoát trên giá trị trống nhưng được đặt nhưng bạn có thể dễ dàng sử dụng cú pháp liên quan ${var:-default} mở rộng thành $var nếu được đặt và không rỗng và default nếu không. Ngoài ra còn có ${var-default} chỉ tạo ra default nếu biến không được đặt đúng.

này có thể đặc biệt hữu ích khi bạn muốn sử dụng set -u nhưng cần phải đối phó với một biến thể unset:

case ${var-} in '') echo "$0: Need a value in var" >&2; exit 1;; esac 

tôi hơi thích case qua if [ "${var-}" = '' ], chủ yếu là bởi vì nó tiết kiệm cho tôi khỏi phải quấn dấu ngoặc kép xung quanh ${var-} và trường hợp pesky có giá trị trong $var được hiểu là tùy chọn để [ và cung cấp cho bạn thông báo lỗi khi bạn mong đợi ít nhất. (Trong Bash, [[ không có những vấn đề này, nhưng tôi thích gắn bó với vỏ POSIX khi có thể.)

10

Nếu bạn muốn kiểm tra rằng một biến không bị để trống, bạn có thể làm điều này:

if [ -z "$tag" ]; then 
    exit 1 
fi 

Từ hướng dẫn cho test:

-z STRING

chiều dài của STRING là số không

Cho rằng bạn đang sử dụng p đối số điều kiện cho tập lệnh, bạn cũng có thể kiểm tra số lượng đối số bạn nhận được bằng cách xem $#.

+2

Bạn cần báo giá xung quanh '" $ tag "' hoặc điều này không thành công trên một chuỗi rỗng (thử nó và xem). –

+0

@EtanReisner cảm ơn! cập nhật –

1

Tôi không chắc bạn có muốn phát hiện xem biến là unset hoặc empty. Đây là 2 thứ khác nhau.Cụ thể, một biến thể được thiết lập nhưng được sản phẩm nào:

$ var="" 
$ if [ -z "$var" ]; then echo empty; fi 
$ empty 

Cùng đang xảy ra ở đây:

#!/usr/bin/env bash 

set -u 
echo $1 

Test:

$ ./test.sh 
./test.sh: line 4: $1: unbound variable 
$ ./test.sh "" 

$ 

Hoặc ở đây:

#!/usr/bin/env bash 

tag=${1?Need a value} 
echo $tag 

Kiểm tra:

$ ./se.sh 
./se.sh: line 3: 1: Need a value 
$ ./se.sh "" 

$ 

Các áp phích khác đã trình bày các cách chính xác để phát hiện biến chưa được đặt và trống. Cá nhân tôi thích cách này phát hiện các biến rỗng và unset:

#!/usr/bin/env bash 

if [ "$1"A = A ] 
then 
    echo variable is empty or unset 
fi 

Test:

$ ./empty.sh "" 
variable is empty or unset 
$ ./empty.sh 
variable is empty or unset 
$ ./empty.sh 1 
$ 
+1

Phương thức A '' $ 1 '' là không cần thiết trong bất kỳ triển khai thực hiện shell từ xa hiện đại nào. Đó là một hack cần thiết cho các shell cũ mà không thể xử lý các đối số rỗng một cách rõ ràng cho lệnh 'test'. '[" $ 1 "=" "]' cũng có thể xử lý một giá trị rỗng/bỏ đặt '$ 1'. – chepner

+0

Nó không phải là cần thiết, nhưng vẫn còn, tôi chỉ thích. Đó là vấn đề sở thích cá nhân. –

0

Sử dụng mô hình phù hợp để phát hiện nếu giá trị chỉ gồm khoảng trắng:

pattern=$'*(|\t)' 
if [[ $1 = $pattern ]]; then 
    echo "First parameter has no non-whitespace characters" 
    exit 1 
fi 

Các $'...' trích dẫn giúp dễ dàng thêm tab vào chuỗi. Mẫu mở rộng *(...) khớp với 0 hoặc nhiều mẫu bên trong dấu ngoặc đơn (tương tự như regex (|\t)*). Mẫu được gán cho một biến vì = thực hiện khớp chuỗi chính xác nếu bất kỳ phần nào của toán hạng bên phải của nó được trích dẫn, vì vậy chúng tôi thực hiện trích dẫn trước để dễ dàng đặt giá trị hơn.

+0

Bạn cần bật tính năng globbing mở rộng để làm việc này, phải không? – tripleee

+0

Có thể. Các phiên bản mới hơn của 'bash' (4.2 và mới hơn?) Tạm thời biến hình cầu mở rộng thành bên trong' [[...]] 'do đó không cần phải làm như vậy một cách rõ ràng. Nếu không, có, 'shopt -s extglob' là cần thiết. – chepner

1

Tôi thích cách Perl sử dụng "chết" và thật dễ dàng để làm điều gì đó tương tự trong trình bao.

# Print (optional) error message and exit 
# Usage: die [[msg] exit_status] 
die() { 
    [[ -n "$1" ]] && echo "$1" 
    [[ -n "$2" ]] && exit $2 || exit 1 
} 

[[ -n "$tag" ]] || die "Need a tag argument. Use $0 --help for details" 

này giả định bash hay vỏ korne, nhưng có thể được chuyển đổi sang vỏ Borne cổ điển bằng cách thay đổi [[]] sang [].

0

Bài kiểm tra sau đảm bảo rằng một biến là Null hoặc có giá trị được gán cho nó. Các dấu ngoặc kép rất quan trọng và phải được sử dụng!

VAL= # Creates a NULL variable 
if [[ -z "$VAL" && "$VAL" = ’’ ]] 
then 
echo "The VAL variable is NULL" 
fi 
or 
VAL=25 
if [[ ! -z "$VAL" && "$VAL" != ’’ ]] 
then 
echo "The VAL variable is NOT NULL" 
fi 
Các vấn đề liên quan