คำตอบ:
ในกรณีส่วนใหญ่[
เป็น builtin test
เปลือกและเทียบเท่ากับ อย่างไรก็ตามtest
มันก็ยังมีอยู่ว่าเป็นปฏิบัติการแบบสแตนด์อโลนนั่นคือสิ่งที่/bin/[
คุณเห็น คุณสามารถทดสอบสิ่งนี้ด้วยtype -a [
(ในระบบ Arch Linux ที่กำลังทำงานbash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
ดังนั้นในระบบของฉันฉันมีสอง[
: builtin เปลือกของฉันและปฏิบัติการ/bin
ได้มา ไฟล์สั่งการถูกบันทึกไว้ใน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.
[ ... ]
อย่างที่คุณเห็นในข้อความที่ตัดตอนมาจากหน้าคนที่ยกมาข้างต้นtest
และ[
เทียบเท่า /bin/[
และ/bin/test
คำสั่งที่ระบุโดย POSIXซึ่งเป็นเหตุผลที่คุณจะพบพวกเขาแม้จะมีความจริงที่ว่าเปลือกหอยจำนวนมากนอกจากนี้ยังให้พวกเขาเป็น builtins การปรากฏตัวของพวกเขาทำให้มั่นใจได้ว่าโครงสร้างเช่น:
[ "$var" -gt 10 ] && echo yes
จะทำงานแม้ว่าเชลล์ที่รันจะไม่มี[
ตัวบิวด์ ตัวอย่างเช่นในtcsh
:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
bash
เป็นเพียงหนึ่งในหลาย ๆ โปรแกรม (เชลล์) ที่ออกแบบมาเพื่อทำงานที่คล้ายกัน Bash เป็นหนึ่งในระบบที่นิยมมากที่สุด แต่มีหลายระบบที่มาพร้อมกับกระสุนเริ่มต้นที่ต่างกัน บางคนที่รู้จักกันดีมีsh
, bash
, zsh
, dash
, ksh
, tcsh
, และcsh
fish
คุณสามารถดูว่าคนที่มีอยู่ในระบบของคุณด้วยcat /etc/shells
และรายการบางส่วนที่นี่
sh
นั้นเป็นdash
แต่ฉันคิดว่าระบบช่วยเหลือใช้/bin/sh
ไม่ได้ยุ่ง คุณแน่ใจไหม?
ที่ใช้สำหรับการทดสอบเงื่อนไขในเชลล์สคริปต์ ชื่ออื่นของโปรแกรมนี้คือtest
:
if [ 1 -lt 2 ]; then ...
ดูเหมือนว่าไวยากรณ์ของเชลล์ แต่ไม่ใช่ โดยปกติแล้วจะ[
เป็นตัวเชลล์ แต่อาจเป็นทางเลือกแทนคำสั่งภายนอก
ดูบล็อก "เงื่อนไขสำนวน" man bash
ใน
[
test
เป็นคำสั่งเดียวกับ ในระบบ * nix บางระบบหนึ่งเป็นเพียงลิงก์ไปยังอีกระบบหนึ่ง ตัวอย่างเช่นหากคุณเรียกใช้:
strings /usr/bin/test
strings /usr/bin/[
คุณจะเห็นผลลัพธ์เดียวกัน
sh-shells / posix-shell ส่วนใหญ่มี builtin [
และtest
คำสั่ง echo
เช่นเดียวกับที่เป็นจริงสำหรับ มีทั้ง/bin/echo
คำสั่งและบิวด์อินในเชลล์ส่วนใหญ่ นั่นเป็นเหตุผลที่บางครั้งคุณรู้สึกเช่นนั้นecho
ไม่ได้ทำงานในระบบที่ต่างกัน
test
หรือ[
กลับเฉพาะรหัสจบการทำงานหรือ0
1
หากการทดสอบสำเร็จรหัสออกเป็น 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
คุณยังสามารถใช้[
กับ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
แต่คุณสามารถใช้if
กับทุกคำสั่งif
สำหรับการทดสอบรหัสออก ตัวอย่างเช่น:
cp x y 2>/dev/null && echo cp x y OK || echo cp x y not OK
หรือใช้if
:
if cp x y 2>/dev/null ; then
echo cp x y OK
else
echo cp x y not OK
fi
คุณสามารถได้ผลลัพธ์เดียวกันโดยใช้test
คำสั่งเพื่อทดสอบรหัสออกที่บันทึกไว้ในตัวแปร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
คุณยังสามารถใช้[[ ]]
และ(( ))
สำหรับการทดสอบได้ แต่สิ่งเหล่านี้ไม่เหมือนกัน[
และtest
แม้ว่าจะมีไวยากรณ์เกือบเหมือนกัน:
สุดท้ายเพื่อค้นหาว่าคำสั่งคืออะไรคุณสามารถใช้:
type -a command
cmp /usr/bin/[ /usr/bin/test
หรืออาจจะ hashes แต่ไม่sha256sum /usr/bin/[ /usr/bin/test
strings
ในระบบของฉัน (openSUSE Tumbleweed) BTW พวกเขาไม่เหมือนกัน (ทำไม)
[
builtin เป็นเพียงเชลล์ที่ผู้เขียนตัดสินใจที่จะไม่เพิ่มเข้าไปtcsh
ไม่ได้มี[
builtin ตัวอย่างเช่น