เวิร์กสเตชันออนไลน์ของ OnWorks Linux และ Windows

โลโก้

ฟรีโฮสติ้งออนไลน์สำหรับเวิร์กสเตชัน

<ก่อนหน้านี้ | เนื้อหา | ถัดไป>

การรวมนิพจน์

นอกจากนี้ยังสามารถรวมนิพจน์เพื่อสร้างการประเมินที่ซับซ้อนยิ่งขึ้นได้อีกด้วย นิพจน์รวมกันโดยใช้ตัวดำเนินการเชิงตรรกะ เราเห็นสิ่งเหล่านี้ในบทที่ 17 เมื่อเราเรียนรู้เกี่ยวกับ พบ สั่งการ. มีการดำเนินการเชิงตรรกะสามประการสำหรับ ทดสอบ และ [[]]. พวกเขาคือ AND, OR และ NOT ทดสอบ และ [[]] ใช้ตัวดำเนินการต่างกันเพื่อแสดงถึงการดำเนินการเหล่านี้:


ตาราง 27-4: ตัวดำเนินการเชิงตรรกะ


การดำเนินการ TESt [[ ]] และ (( ))

การดำเนินการ TESt [[ ]] และ (( ))

AND -NS &&


ภาพ

OR -o ||


ภาพ

ไม่ ! !


ภาพ


นี่คือตัวอย่างของการดำเนินการ AND สคริปต์ต่อไปนี้กำหนดว่าจำนวนเต็มอยู่ในช่วงของค่าหรือไม่:



#! / bin / ทุบตี


# test-integer3: ตรวจสอบว่าจำนวนเต็มอยู่ภายใน a . หรือไม่

# ช่วงของค่าที่ระบุ


MIN_VAL=1 MAX_VAL=100


อินท์=50

#! / bin / ทุบตี


# test-integer3: ตรวจสอบว่าจำนวนเต็มอยู่ภายใน a . หรือไม่

# ช่วงของค่าที่ระบุ


MIN_VAL=1 MAX_VAL=100


อินท์=50



ถ้า [[ "$INT" =~ ^-?[0-9]+$ ]]; แล้ว

ถ้า [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; แล้ว echo "$INT อยู่ในช่วง $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่นอกช่วง"

fi อื่น

echo "INT ไม่ใช่จำนวนเต็ม" >&2 ทางออก 1

fi


ถ้า [[ "$INT" =~ ^-?[0-9]+$ ]]; แล้ว

ถ้า [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; แล้ว echo "$INT อยู่ในช่วง $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่นอกช่วง"

fi อื่น

echo "INT ไม่ใช่จำนวนเต็ม" >&2 ทางออก 1

fi


ในสคริปต์นี้ เราจะกำหนดว่าค่าของจำนวนเต็ม INT อยู่ระหว่างค่าของ MIN_VAL และ MAX_VAL. ทำได้โดยใช้ .เพียงครั้งเดียว [[]]ซึ่งรวมถึงนิพจน์สองนิพจน์ที่คั่นด้วย && โอเปอเรเตอร์ เราสามารถเข้ารหัสสิ่งนี้ได้โดยใช้ ทดสอบ:


if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; แล้ว echo "$INT อยู่ในช่วง $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่นอกช่วง"

fi

if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; แล้ว echo "$INT อยู่ในช่วง $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่นอกช่วง"

fi


พื้นที่ ! ตัวดำเนินการปฏิเสธกลับผลลัพธ์ของนิพจน์ คืนค่า จริง หากนิพจน์เป็นเท็จ คืนค่า เท็จ หากนิพจน์เป็นจริง ในสคริปต์ต่อไปนี้ เราปรับเปลี่ยนตรรกะของการประเมินเพื่อค้นหาค่าของ INT ที่อยู่นอกช่วงที่กำหนด:



#! / bin / ทุบตี


# test-integer4: ตรวจสอบว่าจำนวนเต็มอยู่นอกa .หรือไม่

# ช่วงของค่าที่ระบุ


MIN_VAL=1 MAX_VAL=100


อินท์=50


ถ้า [[ "$INT" =~ ^-?[0-9]+$ ]]; แล้ว

ถ้า [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; แล้ว echo "$INT อยู่นอก $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่ในช่วง"

#! / bin / ทุบตี


# test-integer4: ตรวจสอบว่าจำนวนเต็มอยู่นอกa .หรือไม่

# ช่วงของค่าที่ระบุ


MIN_VAL=1 MAX_VAL=100


อินท์=50


ถ้า [[ "$INT" =~ ^-?[0-9]+$ ]]; แล้ว

ถ้า [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; แล้ว echo "$INT อยู่นอก $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่ในช่วง"



echo "INT ไม่ใช่จำนวนเต็ม" >&2 ทางออก 1

fi


echo "INT ไม่ใช่จำนวนเต็ม" >&2 ทางออก 1

fi

เรายังใส่วงเล็บรอบๆ นิพจน์ สำหรับการจัดกลุ่ม หากไม่รวมสิ่งเหล่านี้ การปฏิเสธจะใช้กับนิพจน์แรกเท่านั้น ไม่ใช้การรวมกันของทั้งสอง กำลังเข้ารหัสสิ่งนี้ด้วย ทดสอบ จะทำดังนี้:


ถ้า [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; แล้ว echo "$INT อยู่นอก $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่ในช่วง"

fi

ถ้า [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; แล้ว echo "$INT อยู่นอก $MIN_VAL ถึง $MAX_VAL"

อื่น

echo "$INT อยู่ในช่วง"

fi


เนื่องจากนิพจน์และตัวดำเนินการทั้งหมดใช้โดย ทดสอบ จะถือว่าเป็นอาร์กิวเมนต์คำสั่งโดยเชลล์ (ไม่เหมือน [[]] และ - ) อักขระที่มีความหมายพิเศษถึง ทุบตีเช่น <, >, (และ )จะต้องยกมาหรือหลบหนี

ภาพ

เห็นว่า ทดสอบ และ [[]] ทำในสิ่งเดียวกันโดยประมาณ อันไหนดีกว่ากัน? ทดสอบ เป็นแบบดั้งเดิม (และเป็นส่วนหนึ่งของ POSIX) ในขณะที่ [[]] มีความเฉพาะเจาะจงกับ ทุบตี. สิ่งสำคัญคือต้องรู้วิธีใช้ ทดสอบเนื่องจากมีการใช้กันอย่างแพร่หลายมากแต่ [[]] มีประโยชน์มากกว่าอย่างชัดเจนและเขียนโค้ดได้ง่ายกว่า ดังนั้นจึงเป็นที่ต้องการสำหรับสคริปต์สมัยใหม่


การพกพาคือฮ็อบก็อบลินของใจน้อย

หากคุณพูดคุยกับผู้ใช้ Unix "ของจริง" คุณจะค้นพบได้อย่างรวดเร็วว่าหลายคนไม่ชอบ Linux มากนัก พวกเขาถือว่าไม่สะอาดและเป็นมลทิน หลักการหนึ่งของผู้ใช้ Unix คือทุกอย่างควรเป็น "พกพา" ซึ่งหมายความว่าสคริปต์ใดๆ ที่คุณเขียนควรสามารถทำงานบนระบบที่เหมือน Unix ได้โดยไม่มีการเปลี่ยนแปลง

คนยูนิกซ์มีเหตุผลที่ดีที่จะเชื่อสิ่งนี้ เมื่อได้เห็นสิ่งที่ Extensions เฉพาะของคำสั่งและเชลล์ทำกับโลก Unix ก่อน POSIX พวกเขาจึงระมัดระวังผลกระทบของ Linux บนระบบปฏิบัติการที่พวกเขาชื่นชอบ

แต่การพกพานั้นมีข้อเสียอย่างร้ายแรง มันป้องกันความก้าวหน้า กำหนดให้ทำสิ่งต่างๆ ให้เสร็จโดยใช้เทคนิค "ตัวส่วนร่วมต่ำสุด" เสมอ ในกรณีของการเขียนโปรแกรมเชลล์ หมายถึงการทำให้ทุกอย่างเข้ากันได้กับ sh,เปลือกบอร์นเดิม.



ภาพ

ข้อเสียนี้เป็นข้อแก้ตัวที่ผู้จำหน่ายซอฟต์แวร์ที่เป็นกรรมสิทธิ์ใช้เพื่อพิสูจน์ส่วนขยายที่เป็นกรรมสิทธิ์ของพวกเขา มีเพียงพวกเขาเท่านั้นที่เรียกว่า "นวัตกรรม" แต่พวกเขาเป็นเพียงอุปกรณ์ล็อคอินสำหรับลูกค้าเท่านั้น

เครื่องมือ GNU เช่น ทุบตี,ไม่มีข้อจำกัดดังกล่าว. พวกเขาสนับสนุนการพกพาโดยการสนับสนุนมาตรฐานและโดยการมีอยู่ทั่วไป คุณสามารถติดตั้ง ทุบตี และเครื่องมือ GNU อื่นๆ ในเกือบทุกระบบ แม้แต่ Windows โดยไม่มีค่าใช้จ่าย ดังนั้นอย่าลังเลที่จะใช้คุณสมบัติทั้งหมดของ ทุบตี. มัน จริงๆ แบบพกพา


ระบบปฏิบัติการคลาวด์คอมพิวติ้งยอดนิยมที่ OnWorks: