สิ่งที่คุณเขียนแล้วใช้งานได้จริง (มันจะใช้ได้ถ้าตัวแปรทั้งหมดเป็นตัวเลข) แต่มันก็ไม่ได้เป็นวิธีที่งี่เง่าเลย
(…)
วงเล็บบ่งชี้subshell สิ่งที่อยู่ข้างในนั้นไม่ได้แสดงออกในภาษาอื่น ๆ อีกมากมาย มันเป็นรายการคำสั่ง (เช่นเดียวกับวงเล็บนอก) คำสั่งเหล่านี้จะถูกดำเนินการในกระบวนการย่อยที่แยกต่างหากดังนั้นการเปลี่ยนเส้นทางการกำหนด ฯลฯ ที่ดำเนินการภายในวงเล็บจะไม่มีผลใด ๆ นอกวงเล็บ
- ด้วยเครื่องหมายดอลลาร์ชั้นนำ
$(…)
คือการแทนที่คำสั่ง : มีคำสั่งอยู่ในวงเล็บและใช้เอาต์พุตจากคำสั่งเป็นส่วนหนึ่งของบรรทัดคำสั่ง (หลังจากการขยายเพิ่มเติมยกเว้นการทดแทนอยู่ระหว่างเครื่องหมายคำพูดคู่ แต่นั่นเป็นอีกเรื่องหนึ่ง ) .
{ … }
การจัดฟันเป็นเหมือนเครื่องหมายวงเล็บในการที่พวกเขาจัดกลุ่มคำสั่ง แต่พวกเขามีผลเฉพาะกับการแยกวิเคราะห์ไม่ใช่การจัดกลุ่ม โปรแกรมx=2; { x=4; }; echo $x
พิมพ์ 4 ในขณะที่x=2; (x=4); echo $x
พิมพ์ 2 (วงเล็บปีกกาต้องใช้ช่องว่างรอบ ๆ พวกเขาและเครื่องหมายอัฒภาคก่อนที่จะปิดในขณะที่วงเล็บไม่. นั่นเป็นเพียงการเล่นโวหารไวยากรณ์)
- ด้วยเครื่องหมายดอลลาร์ชั้นนำ
${VAR}
คือการขยายพารามิเตอร์ขยายไปถึงมูลค่าของตัวแปรที่มีการเปลี่ยนแปลงเพิ่มเติมที่เป็นไปได้
((…))
วงเล็บคู่ล้อมรอบคำสั่งทางคณิตศาสตร์นั่นคือการคำนวณบนจำนวนเต็มด้วยไวยากรณ์ที่คล้ายกับภาษาโปรแกรมอื่น ๆ ไวยากรณ์นี้ส่วนใหญ่จะใช้สำหรับการกำหนดและในเงื่อนไข
- ไวยากรณ์เดียวกันนี้ใช้ในนิพจน์ทางคณิตศาสตร์
$((…))
ซึ่งขยายเป็นค่าจำนวนเต็มของนิพจน์
[[ … ]]
วงเล็บคู่ล้อมรอบนิพจน์เงื่อนไข นิพจน์ตามเงื่อนไขส่วนใหญ่จะสร้างจากตัวดำเนินการเช่น-n $variable
เพื่อทดสอบว่าตัวแปรว่างเปล่าหรือไม่และ-e $file
เพื่อทดสอบว่ามีไฟล์อยู่หรือไม่ นอกจากนี้ยังมีผู้ประกอบการสตริงเท่าเทียมกัน: "$string1" == "$string2"
(ระวังที่ด้านขวามือเป็นรูปแบบเช่น[[ $foo == a* ]]
การทดสอบถ้า$foo
เริ่มต้นด้วยa
ในขณะที่[[ $foo == "a*" ]]
การทดสอบถ้า$foo
เป็นตรงa*
) และคุ้นเคย!
, &&
และ||
ผู้ประกอบการสำหรับการปฏิเสธร่วมและความร้าวฉานเช่นเดียวกับวงเล็บในการจัดกลุ่ม โปรดทราบว่าคุณต้องการช่องว่างรอบตัวดำเนินการแต่ละตัว (เช่น[[ "$x" == "$y" ]]
ไม่ใช่[[ "$x"=="$y" ]]
) และช่องว่างหรือตัวอักษรที่เหมือน;
ทั้งภายในและภายนอกวงเล็บ (เช่น[[ -n $foo ]]
ไม่ใช่[[-n $foo]]
)
[ … ]
วงเล็บเดี่ยวเป็นรูปแบบทางเลือกของการแสดงออกตามเงื่อนไขที่มีนิสัยใจคอมากกว่า (แต่เก่ากว่าและพกพาได้มากกว่า) อย่าเพิ่งเขียนตอนนี้; เริ่มกังวลกับพวกเขาเมื่อคุณพบสคริปต์ที่มีพวกเขา
นี่เป็นวิธีสำนวนที่จะเขียนการทดสอบของคุณใน bash
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
หากคุณต้องการความสะดวกในการพกพาไปยังเปลือกหอยอื่น ๆ นี่จะเป็นวิธี (สังเกตข้อความเพิ่มเติมและชุดของวงเล็บแยกต่างหากสำหรับการทดสอบแต่ละครั้งและการใช้=
โอเปอเรเตอร์ดั้งเดิมแทนที่จะใช้==
ตัวแปรksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then