Câu trả lời:
Trong hầu hết các trường hợp, [
là một vỏ dựng sẵn và tương đương với test
. Tuy nhiên, giống như test
, nó cũng tồn tại như một thực thi độc lập: đó là những /bin/[
gì bạn đã thấy. Bạn có thể kiểm tra điều này với type -a [
(trên hệ thống Arch Linux, đang chạy bash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
Vì vậy, trên hệ thống của tôi, tôi có hai [
: phần mềm dựng sẵn của tôi và phần thực thi /bin
. Việc thực thi được ghi lại trong man test
:
TEST(1) User Commands TEST(1)
NAME
test - check file types and compare values
SYNOPSIS
test EXPRESSION
test
[ EXPRESSION ]
[ ]
[ OPTION
DESCRIPTION
Exit with the status determined by EXPRESSION.
[ ... ]
Như bạn có thể thấy trong đoạn trích của trang man trích dẫn ở trên, test
và [
tương đương. Các lệnh /bin/[
và /bin/test
được chỉ định bởi POSIX , đó là lý do tại sao bạn sẽ tìm thấy chúng mặc dù thực tế là nhiều shell cũng cung cấp chúng dưới dạng nội trang. Sự hiện diện của họ đảm bảo rằng các cấu trúc như:
[ "$var" -gt 10 ] && echo yes
sẽ hoạt động ngay cả khi lớp vỏ chạy chúng không có tích hợp [
. Ví dụ tcsh
: trong :
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
bash
chỉ là một trong nhiều chương trình (shell) được thiết kế để thực hiện các công việc tương tự. Bash là một trong những hệ thống phổ biến nhất nhưng nhiều hệ thống có vỏ mặc định khác nhau. Một số trong những người biết đến nhiều hơn là sh
, bash
, zsh
, dash
, ksh
, tcsh
, csh
và fish
. Bạn có thể thấy những cái có sẵn trên hệ thống của bạn với cat /etc/shells
và một danh sách một phần ở đây .
sh
là dash
nhưng tôi nghĩ hệ thống cứu hộ /bin/sh
không sử dụng busybox. Bạn có chắc không?
Điều đó được sử dụng để kiểm tra điều kiện trong các kịch bản shell. Một tên khác của chương trình này là test
:
if [ 1 -lt 2 ]; then ...
Trông giống như ngữ pháp shell nhưng không phải. Thường [
là shell dựng sẵn nhưng có lẽ là dự phòng, nó tồn tại như một lệnh bên ngoài.
Xem khối "GIẢI THÍCH ĐIỀU KIỆN" trong man bash
.
[
là lệnh tương tự như test
. Trên một số hệ thống * nix, một hệ thống chỉ là một liên kết với nhau. Ví dụ: nếu bạn chạy:
strings /usr/bin/test
strings /usr/bin/[
bạn sẽ thấy đầu ra tương tự.
Hầu hết các sh-shell / posix-shell bao gồm các lệnh dựng sẵn [
và test
lệnh. Điều này cũng đúng với echo
. Có cả /bin/echo
lệnh và nội trang trong hầu hết các shell. Đó là lý do tại sao đôi khi bạn cảm thấy rằng, ví dụ, echo
không hoạt động theo cùng một cách trên các hệ thống khác nhau.
test
hoặc [
chỉ trả lại mã thoát của 0
hoặc 1
. Nếu thử nghiệm thành công, mã thoát là 0.
# you can use [ command but last argument must be ]
# = inside joke for programmers
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write
# [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2 && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no
Bạn cũng có thể sử dụng [
với if
:
if [ -f file.txt ] ; then
echo "file exists"
else
echo "file does not exist"
fi
# is the same as
if test -f file.txt ; then
echo "file exists"
else
echo "file does not exist"
fi
Nhưng bạn có thể sử dụng if
với mọi lệnh, if
để kiểm tra mã thoát. Ví dụ:
cp x y 2>/dev/null && echo cp x y OK || echo cp x y not OK
Hoặc, sử dụng if
:
if cp x y 2>/dev/null ; then
echo cp x y OK
else
echo cp x y not OK
fi
Bạn có thể nhận được kết quả tương tự bằng cách chỉ sử dụng test
lệnh để kiểm tra mã thoát được lưu vào biến stat
:
cp x y 2>/dev/null
stat=$?
if test "$stat" = 0 ; then
echo cp x y OK
else
echo cp x y not OK
fi
Bạn cũng có thể sử dụng [[ ]]
và (( ))
để thử nghiệm, nhưng chúng không giống nhau [
và test
, mặc dù có cùng một cú pháp:
Cuối cùng, để tìm hiểu lệnh là gì, bạn có thể sử dụng:
type -a command
cmp /usr/bin/[ /usr/bin/test
hoặc có thể băm sha256sum /usr/bin/[ /usr/bin/test
nhưng không strings
. Trên hệ thống của tôi (openSUSE Tumbleweed) BTW chúng không giống nhau (tại sao).
[
dựng sẵn chỉ là một shell mà các tác giả quyết định không thêm nó.tcsh
không có một[
BUILTIN ví dụ.