Jawaban:
Dalam kebanyakan kasus, [
shell adalah builtin dan setara dengan test
. Namun, seperti test
, itu juga ada sebagai executable mandiri: itu yang /bin/[
Anda lihat. Anda dapat menguji ini dengan type -a [
(pada sistem Arch Linux, berjalan bash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
Jadi, pada sistem saya, saya punya dua [
: builtin shell saya dan executable di /bin
. Yang dapat dieksekusi didokumentasikan dalam 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.
[ ... ]
Seperti yang Anda lihat dalam kutipan halaman manual yang dikutip di atas, test
dan [
setara. The /bin/[
dan /bin/test
perintah yang ditentukan oleh POSIX yang mengapa Anda akan menemukan mereka meskipun fakta bahwa banyak kerang juga menyediakan mereka sebagai builtin. Kehadiran mereka memastikan bahwa konstruksi seperti:
[ "$var" -gt 10 ] && echo yes
akan berfungsi bahkan jika shell yang menjalankannya tidak memiliki [
builtin. Misalnya, di tcsh
:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
bash
hanya satu dari banyak program (cangkang) yang dirancang untuk melakukan pekerjaan serupa. Bash adalah salah satu sistem yang paling populer tetapi banyak kapal dengan shell default yang berbeda. Beberapa yang lebih dikenal adalah sh
, bash
, zsh
, dash
, ksh
, tcsh
, csh
dan fish
. Anda dapat melihat yang tersedia di sistem Anda dengan cat /etc/shells
dan sebagian daftar di sini .
sh
adalah dash
tetapi saya pikir sistem penyelamatan /bin/sh
tidak menggunakan busybox. Apakah kamu yakin
Itu digunakan untuk pengujian kondisi dalam skrip shell. Nama lain dari program ini adalah test
:
if [ 1 -lt 2 ]; then ...
Itu terlihat seperti tata bahasa shell tetapi tidak. Biasanya [
shell dibangun tetapi mungkin sebagai fallback itu ada sebagai perintah eksternal.
Lihat blok "EKSPRESI KONDISIONAL" di man bash
.
[
adalah perintah yang sama dengan test
. Pada beberapa sistem * nix, satu hanyalah tautan ke lainnya. Misalnya, jika Anda menjalankan:
strings /usr/bin/test
strings /usr/bin/[
Anda akan melihat output yang sama.
Sebagian besar sh-shells / posix-shells termasuk builtin [
dan test
perintah. Hal yang sama berlaku untuk echo
. Ada banyak /bin/echo
perintah dan builtin di sebagian besar shell. Itulah alasan mengapa terkadang Anda merasa bahwa, misalnya, echo
tidak bekerja dengan cara yang sama pada sistem yang berbeda.
test
atau [
hanya mengembalikan kode keluar 0
atau 1
. Jika tes berhasil, kode keluar adalah 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
Anda juga dapat menggunakan [
dengan 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
Tetapi Anda dapat menggunakannya if
dengan setiap perintah, if
untuk menguji kode keluar. Sebagai contoh:
cp x y 2>/dev/null && echo cp x y OK || echo cp x y not OK
Atau, menggunakan if
:
if cp x y 2>/dev/null ; then
echo cp x y OK
else
echo cp x y not OK
fi
Anda bisa mendapatkan hasil yang sama hanya menggunakan test
perintah untuk menguji kode keluar yang disimpan ke variabel 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
Anda juga dapat menggunakan [[ ]]
dan (( ))
untuk pengujian, tetapi itu tidak sama dengan [
dan test
, meskipun memiliki sintaks yang hampir sama:
Akhirnya, untuk mengetahui apa itu perintah, Anda dapat menggunakan:
type -a command
cmp /usr/bin/[ /usr/bin/test
atau mungkin hash sha256sum /usr/bin/[ /usr/bin/test
tetapi tidak strings
. Di sistem saya (openSUSE Tumbleweed) BTW mereka tidak sama (kenapa).
[
builtin hanyalah shell yang pembuatnya memutuskan untuk tidak menambahkannya.tcsh
tidak memiliki sebuah[
builtin misalnya.