Câu trả lời:
Đó là kiểm tra $1
trống, mặc dù nó nên được trích dẫn (giống hệt [ -z "$1" ]
). Một số shell rất cũ không xử lý đúng các chuỗi rỗng, vì vậy các tác giả của các kịch bản di động đã áp dụng kiểu kiểm tra này. Nó không cần thiết trong nhiều thập kỷ, nhưng mọi người vẫn làm theo cách đó bởi vì mọi người vẫn làm theo cách đó.
[ x$1 = x ]
vẫn chạy sai, nhưng [ "x$1" = x ]
sẽ cho vỏ có một vấn đề mà $1
là !
hay (
hay -n
.... [ "" = "$1" ]
và case $1 in "")
cũng sẽ là OK mặc dù.
[ -z "$1" ]
và [ "$1" = "" ]
vẫn không hoạt động với / bin / sh của Solaris 10, trước đây có dấu gạch ngang-0,5.4.
[ "$1" = "" ]
vẫn không hoạt động với phiên bản này /bin/sh
(mặc dù bạn không muốn sử dụng /usr/xpg4/bin/sh
ở đó /bin/sh
). dash đã được sửa trong vấn đề đó vào tháng 1 năm 2009.
Dấu ngoặc vuông biểu thị một bài kiểm tra , do đó, [ x$1 = x]
không có if
hoặc một cái gì đó tương tự là vô nghĩa, mặc dù về mặt cú pháp thì ok.
Nó có nghĩa là đánh giá thành đúng nếu x$1
mở rộng thành x
và sai, nhưng vì nó không được trích dẫn, nếu $1
là (ví dụ) "hey x", trình bao sẽ thấy x = x
, vì vậy công trình này vẫn không an toàn.
Mục đích của việc x = x
kiểm tra là xác định xem một biến có trống không. Một cách phổ biến hơn để làm điều này là chỉ sử dụng dấu ngoặc kép:
if [ "$1" = "" ]; then
Toán tử kiểm tra Bash -z
và -n
cũng có thể được sử dụng, nhưng chúng ít di động hơn với các loại đạn khác. 1
Lý do cho các trích dẫn, hoặc là x$1
, vì phía bên trái không mở rộng thành không có gì, đó sẽ là một lỗi cú pháp:
if [ = x ] # No good!
if [ "" = "" ] # Okay.
if [ x = x ] # Also okay.
1. Trên thực tế, test
có thể là tiện ích độc lập nhưng hầu hết các shell thực hiện nó dưới dạng tích hợp; kiểm tra sự khác biệt giữa which test
và type test
. Trên GNU / Linux man test
tuyên bố đề cập đến tích hợp sẵn, nhưng nếu bạn gọi (ví dụ) /usr/bin/test
, tiện ích đó dường như thực hiện các tính năng được ghi trong trang hướng dẫn, bao gồm -z
và -n
.
[ x$1 = x ]
cũng sẽ đánh giá là đúng nếu $1
là ví dụ " -o x"
. Hãy thử sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
là sai và không có ý nghĩa.
if
phải sử dụng test
, bạn có thể sử dụng nó trước khi &&
, ||
hoặc sau while
hoặc kiểm tra kết quả bằng cách sử dụng$?
[ x$1 = x ]
Chỉ có ý nghĩa trong zsh
. Điều đó so sánh sự kết hợp x
với đối số đầu tiên của kịch bản x
. Vì vậy, [
lệnh trả về true nếu $1
trống hoặc không được cung cấp.
[ $1 = "" ]
Sẽ không hoạt động bởi vì, zsh
khi một biến rỗng không được trích dẫn trong ngữ cảnh danh sách, nó sẽ mở rộng thành không có đối số nào thay vì một đối số trống, vì vậy nếu $1
không được đặt hoặc trống, [
lệnh sẽ chỉ nhận dưới dạng đối số [
, =
chuỗi rỗng và ]
nó không thể có ý nghĩa [ -z "$1" ]
hoặc [ "$1" = "" ]
sẽ ổn dù như trong vỏ POSIX.
Trong shell của Bourne-like / POSIX, [ x$1 = x ]
không có nghĩa gì. Đó là toán tử split + global bằng cách nào đó được áp dụng cho việc ghép x
và đối số đầu tiên của tập lệnh hy vọng rằng kết quả =
và x
, và ]
tạo thành một biểu thức kiểm tra hợp lệ cho [
lệnh.
Ví dụ, nếu kịch bản đã được thông qua một " = x -o x ="
đối số, [
sẽ nhận được những lý lẽ: [
, x
, =
, x
, -o
, x
, =
, x
, ]
, mà [
sẽ hiểu như so sánh x
với x
và x
với x
và trở thành sự thật.
Nếu $1
là "* *"
, thì shell sẽ chuyển đến [
lệnh danh sách các tệp trong thư mục hiện tại có tên bắt đầu bằng x
(mở rộng toàn cầu x*
), sau đó danh sách các tệp không bị ẩn (mở rộng *
) ... [
không có khả năng để làm cho bất kỳ ý nghĩa ra khỏi. Các trường hợp duy nhất có thể làm bất cứ điều gì hợp lý là nếu $1
không chứa ký tự đại diện hoặc ký tự trống.
Bây giờ, những gì bạn đôi khi tìm thấy là mã như:
[ "x$1" = x ]
Điều đó được sử dụng để kiểm tra nếu $1
trống hoặc không đặt.
Cách thông thường để kiểm tra biến rỗng hoặc không đặt là:
[ -z "$1" ]
Nhưng điều đó không thành công đối với một số giá trị $1
như =
trong một số [
triển khai (không phải POSIX) như tích hợp trong vỏ Bourne như /bin/sh
trên Solaris 10 và trước đó hoặc một số phiên bản cũ của dash
(lên tới 0,5,4) hoặc sh
của một số BSD.
Đó là bởi vì [
nhìn thấy [
, -z
, =
, ]
và phàn nàn về việc thiếu đối số cho các =
nhà điều hành nhị phân thay vì tìm hiểu nó như là -z
toán tử đơn hạng áp dụng cho các =
chuỗi.
Tương tự, [ "$1" = "" ]
thất bại đối với một số triển khai [
nếu $1
là !
hoặc (
.
Trong các shell / [
triển khai:
[ "x$1" = x ]
luôn luôn là một thử nghiệm hợp lệ bất kể giá trị của $1
, vì vậy:
[ "" = "$1" ]
và:
[ -z "${1:+x}" ]
và
case $1 in "") ...; esac
Tất nhiên, nếu bạn muốn kiểm tra xem không có đối số nào được cung cấp, bạn sẽ làm:
[ "$#" -eq 0 ]
Đó là, bạn kiểm tra số lượng đối số được truyền cho tập lệnh.
Lưu ý rằng hiện nay, [ -z "$var" ]
được quy định rõ ràng bởi POSIX và không thể thất bại trong tuân thủ QTI [
triển khai (và bash
's [
là và đã được trong nhiều thập niên). Vì vậy, bạn sẽ có thể dựa vào nó trong POSIX sh hoặc bash
script.
x$1
đang nối hai chuỗi x
và $1
nếu $ 1 trống, x $ 1 bằng x và [x $ 1 = x] sẽ là kết quả đúng. x = y
được sử dụng để so sánh chuỗi trong sh
x$1
được trích dẫn, vì vậy việc phân tách và tạo khối được thực hiện trên những cái đó.
[ x$1 = x ]
là đúng nếu $1
unset / null / trống hay không.
Hãy thử bản thân với:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
và
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"
[ x$1 = x ]
cũng đúng nếu $1
là ví dụ " -o x"
. Hãy thử sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
là sai và không có ý nghĩa.