วัตถุประสงค์ของการปฏิบัติการวงเล็บเหลี่ยมคืออะไร


คำตอบ:


33

ในกรณีส่วนใหญ่[เป็น 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

5
@AlexandruIrimiea คุณหมายถึงอะไร? เชลล์ที่ไม่มี[builtin เป็นเพียงเชลล์ที่ผู้เขียนตัดสินใจที่จะไม่เพิ่มเข้าไป tcsh ไม่ได้มี[ builtin ตัวอย่างเช่น
terdon

7
@AlexandruIrimiea พวกเขาไม่ใช่หอย "กำหนดเอง" มันbashเป็นเพียงหนึ่งในหลาย ๆ โปรแกรม (เชลล์) ที่ออกแบบมาเพื่อทำงานที่คล้ายกัน Bash เป็นหนึ่งในระบบที่นิยมมากที่สุด แต่มีหลายระบบที่มาพร้อมกับกระสุนเริ่มต้นที่ต่างกัน บางคนที่รู้จักกันดีมีsh, bash, zsh, dash, ksh, tcsh, และcsh fishคุณสามารถดูว่าคนที่มีอยู่ในระบบของคุณด้วยcat /etc/shellsและรายการบางส่วนที่นี่
terdon

1
@ JörgWMittagจริงเหรอ? ฉันรู้ว่าอูบุนตูshนั้นเป็นdashแต่ฉันคิดว่าระบบช่วยเหลือใช้/bin/shไม่ได้ยุ่ง คุณแน่ใจไหม?
terdon

2
อย่างไรก็ตามมีช่องว่างใน initramfs ตามหลักฐานจากคำถาม
Sergiy Kolodyazhnyy

1
@AlexandruIrimiea เกี่ยวกับคำสั่งที่จำเป็นต้องมีในตัวและคำสั่งใดที่อาจมีหรือไม่มีอยู่ในตัวโปรดดูโพสต์นี้
ไวด์การ์ด

12

ที่ใช้สำหรับการทดสอบเงื่อนไขในเชลล์สคริปต์ ชื่ออื่นของโปรแกรมนี้คือtest:

if [ 1 -lt 2 ]; then ...

ดูเหมือนว่าไวยากรณ์ของเชลล์ แต่ไม่ใช่ โดยปกติแล้วจะ[เป็นตัวเชลล์ แต่อาจเป็นทางเลือกแทนคำสั่งภายนอก

ดูบล็อก "เงื่อนไขสำนวน" man bashใน


1
ดูเพิ่มเติมที่: unix.stackexchange.com/questions/224616/…
dr01

9

[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 พวกเขาไม่เหมือนกัน (ทำไม)
Hauke ​​Laging

ฉันไม่ได้หมายถึงการเปรียบเทียบไบต์ ในบาง * ระวังพวกเขาเหมือนกันในไบต์ระดับ = เชื่อมโยง การทดสอบ Posix
kshji
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.