การสร้างเชลล์สคริปต์เป็นหนึ่งในทักษะที่สำคัญที่สุดที่ผู้ใช้ Linux ควรมีเพียงแค่ปลายนิ้วสัมผัส เชลล์สคริปต์มีบทบาทอย่างมากในการทำงานซ้ำๆ โดยอัตโนมัติ ซึ่งมิฉะนั้น การดำเนินการทีละบรรทัดจะน่าเบื่อหน่าย
ในบทช่วยสอนนี้ เราเน้นย้ำถึงการดำเนินการเชลล์สคริปต์พื้นฐานบางอย่างที่ผู้ใช้ Linux ทุกคนควรมี
1. สร้างเชลล์สคริปต์อย่างง่าย
เชลล์สคริปต์คือไฟล์ที่ประกอบด้วย ASCII ข้อความ. เราจะเริ่มต้นด้วยการสร้างเชลล์สคริปต์อย่างง่าย และในการดำเนินการนี้ เราจะใช้โปรแกรมแก้ไขข้อความ มีโปรแกรมแก้ไขข้อความค่อนข้างมาก ทั้งแบบบรรทัดคำสั่งและแบบ GUI สำหรับคำแนะนำนี้ เราจะใช้ตัวแก้ไข vim
เราจะเริ่มต้นด้วยการสร้างสคริปต์ง่ายๆ ที่แสดง “สวัสดีชาวโลก ” เมื่อดำเนินการ
$ vim hello.sh
วางเนื้อหาต่อไปนี้ในไฟล์และบันทึก
#!/bin/bash # Print Hello world message echo "Hello World!"
มาดูเชลล์สคริปต์ทีละบรรทัด
- บรรทัดแรก –
#!/bin/bash
– เป็นที่รู้จักกันในชื่อ shebang header นี่เป็นโครงสร้างพิเศษที่ระบุว่าจะใช้โปรแกรมใดในการตีความสคริปต์ ในกรณีนี้ นี่จะเป็น ทุบตี เชลล์ระบุโดย /bin/bash . มีภาษาสคริปต์อื่นๆ เช่น Python ซึ่งแสดงด้วย#!/usr/bin/python3
และ Perl ซึ่งส่วนหัว shebang นั้นแสดงโดย#!/usr/bin/perl
. - บรรทัดที่สองคือความคิดเห็น ความคิดเห็นคือคำสั่งที่อธิบายสิ่งที่เชลล์สคริปต์ทำและไม่ถูกเรียกใช้งานเมื่อรันสคริปต์ เครื่องหมายแฮชนำหน้าความคิดเห็นเสมอ
#
. - บรรทัดสุดท้ายคือคำสั่งที่พิมพ์ 'Hello World ’ ข้อความบนเทอร์มินัล
ขั้นตอนต่อไปคือการทำให้สคริปต์สามารถเรียกใช้งานได้โดยกำหนดสิทธิ์ในการดำเนินการโดยใช้ chmod คำสั่งตามภาพ
$ chmod +x hello.sh
สุดท้าย ให้รันเชลล์สคริปต์โดยใช้คำสั่งใดคำสั่งหนึ่ง:
$ bash hello.sh OR $ ./hello.sh
2. การใช้คำสั่งแบบมีเงื่อนไขเพื่อรันโค้ด
เช่นเดียวกับภาษาโปรแกรมอื่นๆ คำสั่งเงื่อนไข ใช้ในการเขียนสคริปต์ทุบตีเพื่อตัดสินใจ โดยมีความแตกต่างเพียงเล็กน้อยในไวยากรณ์ เราจะกล่าวถึง ถ้า , ถ้าเป็นอย่างอื่น และ เอลฟ์ คำสั่งแบบมีเงื่อนไข
ตัวอย่างคำสั่ง if เท่านั้น
ถ้า คำสั่งสามารถใช้เพื่อทดสอบเงื่อนไขเดียวหรือหลายเงื่อนไข เราจะเริ่มต้นด้วยการใช้ if . ขั้นพื้นฐาน คำสั่งเพื่อทดสอบเงื่อนไขเดียว ถ้า คำสั่งถูกกำหนดโดย if ... fi
บล็อก
if command then statement fi
มาดูเชลล์สคริปต์ด้านล่างกัน
#!/bin/bash echo 'Enter the score' read x if [[ $x == 70 ]]; then echo 'Good job!' fi
เชลล์สคริปต์ด้านบนจะแจ้งให้ผู้ใช้ให้คะแนนที่จัดเก็บในตัวแปร x . หากคะแนนตรงกับ 70 สคริปต์ส่งคืนผลลัพธ์ “ทำได้ดีมาก! ” ตัวดำเนินการเปรียบเทียบ ==
ใช้เพื่อทดสอบว่าคะแนนที่ป้อนซึ่งเก็บไว้ในตัวแปร x , เท่ากับ 100 .
ตัวดำเนินการเปรียบเทียบอื่นๆ ที่คุณสามารถใช้ได้ ได้แก่:
-eq
– เท่ากับ-ne
– ไม่เท่ากับ-lt
– น้อยกว่า-le
– น้อยกว่าหรือเท่ากับ-lt
– น้อยกว่า-ge
– มากกว่าหรือเท่ากับ
ตัวอย่างเช่น if-statement บล็อกด้านล่างพิมพ์ว่า 'ทำงานหนักขึ้น ’ หากคะแนนอินพุตมีค่าน้อยกว่า 50 .
if [[ $x -lt 50 ]]; then echo 'Work Harder!' fi
ตัวอย่างประโยค if-else
สำหรับสถานการณ์ที่คุณมีผลลัพธ์ที่เป็นไปได้ 2 อย่าง:– ไม่ว่าสิ่งนี้หรือสิ่งนั้น – คำสั่ง if-else นั้นมีประโยชน์
if command then statement1 else statement2 fi
สคริปต์ด้านล่างอ่านคะแนนอินพุตและตรวจสอบว่ามากกว่าหรือเท่ากับ 70 .
หากคะแนนมากกว่าหรือเท่ากับ 70 คุณได้รับ 'เยี่ยมมาก คุณผ่าน! ' ข้อความ. อย่างไรก็ตาม หากคะแนนต่ำกว่า 70 , ผลลัพธ์ 'คุณล้มเหลว ’ จะถูกพิมพ์
#!/bin/bash echo 'Enter the score' read x if [[ $x -ge 70 ]]; then echo 'Great job, You passed!' else echo 'You failed' fi
ตัวอย่างคำสั่ง if-elif-else
ในสถานการณ์ที่มีเงื่อนไขหลายอย่างและผลลัพธ์ที่แตกต่างกัน if-elif-else มีการใช้คำสั่ง คำสั่งนี้มีรูปแบบดังต่อไปนี้
if condition1 then statement1 elif condition2 then statement2 else statement3 fi
ตัวอย่างเช่น เรามีสคริปต์สำหรับลอตเตอรีที่ตรวจสอบว่าหมายเลขที่ป้อนคือ 90 , 60 หรือ 30 .
#!/bin/bash echo 'Enter the score' read x if [[ $x -eq 90 ]]; then echo “You have won the First Prize” elif [[ $x -eq 60 ]]; then echo “You have won the Second Prize” elif [[ $x -eq 30 ]]; then echo “You have won the Second Prize” else echo “Please try again” fi
3. การใช้คำสั่ง if กับ AND Logic
คุณสามารถใช้ ถ้า คำสั่งข้าง และ ตัวดำเนินการตรรกะเพื่อดำเนินงานหากตรงตามเงื่อนไขสองข้อ &&
ตัวดำเนินการใช้เพื่อแสดงถึง และ ตรรกะ
#!/bin/bash echo 'Please Enter your user_id' read user_id echo 'Please Enter your tag_no' read tag_id if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]]; then echo “Login successful” else echo “Login failure” fi
5. การใช้คำสั่ง if กับลอจิก OR
เมื่อใช้ OR ตรรกะที่แสดงด้วย ||
สัญลักษณ์ เงื่อนไขใดเงื่อนไขหนึ่งต้องสอดคล้องกับสคริปต์เพื่อให้ได้ผลลัพธ์ที่คาดหวัง
#!/bin/bash echo 'Please enter a random number' read number if [[ (number -eq 55 || number -eq 80) ]]; then echo 'Congratulations! You’ve won' else echo 'Sorry, try again' fi
ใช้โครงสร้างการวนซ้ำ
ทุบตี ลูป อนุญาตให้ผู้ใช้ดำเนินการชุดของงานจนกว่าจะบรรลุผลสำเร็จ สิ่งนี้มีประโยชน์ในการทำงานซ้ำๆ ในส่วนนี้ เราจะมาดูลูปบางส่วนที่คุณจะพบในภาษาการเขียนโปรแกรมอื่นๆ
ขณะวนซ้ำ
นี่เป็นหนึ่งในลูปที่ง่ายที่สุดในการทำงานด้วย ไวยากรณ์ค่อนข้างง่าย:
while <some test> do commands done
วง while ด้านล่างแสดงตัวเลขทั้งหมดตั้งแต่ 1 ถึง 10 เมื่อดำเนินการ
#!/bin/bash # A simple while loop counter=1 while [ $counter -le 10 ] do echo $counter ((counter++)) done
มาพูดถึงวง while กัน:
ตัวแปร ตัวนับ เริ่มต้นเป็น 1 . และในขณะที่ตัวแปรมีค่าน้อยกว่าหรือเท่ากับ 10 ค่าของตัวนับจะเพิ่มขึ้นจนกว่าเงื่อนไขจะเป็นที่พอใจ บรรทัด echo $counter พิมพ์ตัวเลขทั้งหมดตั้งแต่ 1 ถึง 10
สำหรับลูป
ชอบในขณะที่ วนซ้ำ , สำหรับลูป ใช้ในการรันโค้ดซ้ำๆ เช่น. เรียกใช้โค้ดซ้ำให้มากที่สุดเท่าที่จะทำได้โดยผู้ใช้กำหนด
ไวยากรณ์คือ:
for var in 1 2 3 4 5 N do command1 command2 done
สำหรับลูป ด้านล่างวนซ้ำถึง 1 ถึง 10 และประมวลผลค่าบนหน้าจอ
วิธีที่ดีกว่าในการบรรลุเป้าหมายนี้คือการกำหนดช่วงโดยใช้เครื่องหมายปีกกาคู่ { }
ตามที่แสดงแทนการพิมพ์ตัวเลขทั้งหมด
#!/bin/bash # Specify range in a for loop for num in {1..10} do echo $num done
ทุบตีพารามิเตอร์ตำแหน่ง
พารามิเตอร์ตำแหน่งเป็นตัวแปรพิเศษที่อ้างอิงในสคริปต์เมื่อมีการส่งผ่านค่าบนเชลล์แต่ไม่สามารถกำหนดได้ พารามิเตอร์ตำแหน่งเรียกใช้จาก $0 $1 $2 $3 …… ถึง $9 . นอกเหนือจาก $9 ค่าพารามิเตอร์จะต้องอยู่ในวงเล็บปีกกาเช่น ${10}, ${11} … เป็นต้น
เมื่อเรียกใช้งานสคริปต์ พารามิเตอร์ตำแหน่งแรกคือ $0 ใช้ชื่อของเชลล์สคริปต์ $1 พารามิเตอร์รับตัวแปรแรกที่ส่งผ่านไปยังเทอร์มินัล $2 ที่สอง $3 ที่สามเป็นต้น
มาสร้างสคริปต์ test.sh กันเถอะ
#!/bin/bash echo "The name of the script is: " $0 echo "My first name is: " $1 echo "My second name is: " $2
ถัดไป รันสคริปต์และระบุชื่อและชื่อที่สองเป็นอาร์กิวเมนต์:
# bash test.sh James Kiarie
จากผลลัพธ์ เราจะเห็นได้ว่าตัวแปรแรกที่พิมพ์ออกมาคือชื่อของเชลล์สคริปต์ ในกรณีนี้คือ test.sh . หลังจากนั้น ชื่อจะถูกพิมพ์ออกมาตามพารามิเตอร์ตำแหน่งที่กำหนดไว้ในเชลล์สคริปต์
พารามิเตอร์ตำแหน่งมีประโยชน์ในการช่วยให้คุณปรับแต่งข้อมูลที่ป้อนแทนที่จะกำหนดค่าให้กับตัวแปรอย่างชัดเจน
รหัสออกจากคำสั่งเชลล์
เริ่มต้นด้วยการตอบคำถามง่ายๆ รหัสทางออก . คืออะไร ?
ทุกคำสั่งที่ดำเนินการบนเชลล์โดยผู้ใช้หรือเชลล์สคริปต์มีสถานะออก สถานะการออกเป็นจำนวนเต็ม
สถานะการออก 0 หมายความว่าคำสั่งดำเนินการสำเร็จโดยไม่มีข้อผิดพลาด อะไรก็ได้ระหว่าง 1 ถึง 255 แสดงว่าคำสั่งล้มเหลวหรือดำเนินการไม่สำเร็จ
หากต้องการค้นหาสถานะการออกของคำสั่ง ให้ใช้ $?
ตัวแปรเชลล์
สถานะการออก 1 ชี้ไปที่ข้อผิดพลาดทั่วไปหรือข้อผิดพลาดที่ไม่ได้รับอนุญาต เช่น การแก้ไขไฟล์โดยไม่มีการอนุญาต sudo
สถานะการออก 2 ชี้ถึงการใช้คำสั่งหรือตัวแปรเชลล์ในตัวที่ไม่ถูกต้อง
สถานะการออก 127 สถานะชี้ไปที่คำสั่งที่ผิดกฎหมายซึ่งมักจะให้ 'ไม่พบคำสั่ง ’ ผิดพลาด
การประมวลผลผลลัพธ์ของคำสั่งเชลล์ภายในสคริปต์
ในการเขียนสคริปต์ทุบตี คุณสามารถเก็บผลลัพธ์ของคำสั่งไว้ในตัวแปรเพื่อใช้ในอนาคตได้ ซึ่งเรียกอีกอย่างว่าการแทนที่คำสั่งเชลล์และสามารถทำได้ด้วยวิธีต่อไปนี้
variable=$(command) OR variable=$(/path/to/command) OR variable=$(command argument 1 argument 2 ...)
ตัวอย่างเช่น คุณสามารถจัดเก็บ วันที่ คำสั่งในตัวแปรที่เรียกว่า วันนี้ และเรียกเชลล์สคริปต์เพื่อเปิดเผยวันที่ปัจจุบัน
#!/bin/bash today=$(date) echo “Today is $today”
ลองมาอีกตัวอย่างหนึ่ง สมมติว่าคุณต้องการค้นหาผู้ใช้ล็อกอินที่ถูกต้องบนระบบ Linux ของคุณ คุณจะไปเกี่ยวกับมันได้อย่างไร ขั้นแรก รายชื่อผู้ใช้ทั้งหมด (ทั้งระบบ กระบวนการ และผู้ใช้ที่เข้าสู่ระบบ) จะถูกเก็บไว้ใน /etc/passwd ไฟล์.
หากต้องการดูไฟล์ คุณต้องใช้คำสั่ง cat อย่างไรก็ตาม หากต้องการจำกัดให้แคบลงเพื่อเข้าสู่ระบบผู้ใช้ ให้ใช้คำสั่ง grep เพื่อค้นหาผู้ใช้ด้วย /bin/bash และใช้ cut -c 1-10 คำสั่งตามที่แสดงเพื่อแสดงอักขระ 10 ตัวแรกของชื่อ
เราได้จัดเก็บ คำสั่ง cat ถึง login_users ตัวแปร
#!/bin/bash login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10) echo 'This is the list of login users: echo $login_users
สิ่งนี้ทำให้บทช่วยสอนของเราเกี่ยวกับการสร้างเชลล์สคริปต์อย่างง่ายสิ้นสุดลง เราหวังว่าคุณจะพบว่าสิ่งนี้มีค่า