ค้นหาเว็บไซต์

วิธีสร้างเชลล์สคริปต์อย่างง่ายใน Linux


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

ในบทช่วยสอนนี้ เราเน้นการดำเนินการเชลล์สคริปต์พื้นฐานบางอย่างที่ผู้ใช้ Linux ทุกคนควรมี

1. สร้างเชลล์สคริปต์อย่างง่าย

เชลล์สคริปต์คือไฟล์ที่ประกอบด้วยข้อความ ASCII เราจะเริ่มต้นด้วยการสร้างเชลล์สคริปต์ง่ายๆ และในการดำเนินการนี้ เราจะใช้โปรแกรมแก้ไขข้อความ มีโปรแกรมแก้ไขข้อความจำนวนมาก ทั้งแบบบรรทัดคำสั่งและแบบ GUI สำหรับคำแนะนำนี้ เราจะใช้โปรแกรมแก้ไขเป็นกลุ่ม

เราจะเริ่มต้นด้วยการสร้างสคริปต์ง่ายๆ ที่แสดง “สวัสดีชาวโลก ” เมื่อดำเนินการ

vim hello.sh

วางเนื้อหาต่อไปนี้ลงในไฟล์แล้วบันทึก

#!/bin/bash
Print Hello world message
echo "Hello World!"

มาดูเชลล์สคริปต์ทีละบรรทัดกันดีกว่า

  • บรรทัดแรก - #!/bin/bash - เรียกว่าส่วนหัว shebang นี่เป็นโครงสร้างพิเศษที่ระบุว่าโปรแกรมใดที่จะใช้ในการตีความสคริปต์ ในกรณีนี้ นี่จะเป็นเชลล์ bash ที่ระบุโดย /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-else และ elif

ตัวอย่างคำสั่ง if เท่านั้น

คำสั่ง if สามารถใช้เพื่อทดสอบเงื่อนไขเดียวหรือหลายเงื่อนไขได้ เราจะเริ่มต้นด้วยการใช้คำสั่ง 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 ด้านล่างจะพิมพ์ว่า "ทำงานหนักขึ้น" หากคะแนนที่ป้อนมีค่าน้อยกว่า 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

คุณสามารถใช้คำสั่ง if ควบคู่ไปกับตัวดำเนินการตรรกะ AND เพื่อดำเนินการงานได้หากตรงตามเงื่อนไขสองข้อ ตัวดำเนินการ && ใช้เพื่อแสดงถึงตรรกะ AND

#!/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 Logic

เมื่อใช้ตรรกะ หรือ ที่แสดงด้วยสัญลักษณ์ || เงื่อนไขข้อใดข้อหนึ่งจะต้องสอดคล้องกับสคริปต์เพื่อให้ได้ผลลัพธ์ที่คาดหวัง

#!/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

ใช้โครงสร้างการวนซ้ำ

Bash ลูป อนุญาตให้ผู้ใช้ทำงานต่างๆ มากมายจนกว่าจะบรรลุผลที่แน่นอน สิ่งนี้มีประโยชน์ในการปฏิบัติงานซ้ำ ๆ ในส่วนนี้ เราจะมาดูลูปบางส่วนที่คุณจะพบในภาษาการเขียนโปรแกรมอื่นๆ ด้วย

ในขณะที่วนซ้ำ

นี่เป็นหนึ่งในลูปที่ง่ายที่สุดในการทำงานด้วย ไวยากรณ์ค่อนข้างง่าย:

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 loop:

ตัวแปร ตัวนับ ถูกเตรียมใช้งานเป็น 1 และแม้ว่าตัวแปรจะน้อยกว่าหรือเท่ากับ 10 ค่าของตัวนับจะเพิ่มขึ้นจนกว่าจะตรงตามเงื่อนไข บรรทัด echo $counter จะพิมพ์ตัวเลขทั้งหมดตั้งแต่ 1 ถึง 10

สำหรับวง

เช่นเดียวกับ while loop for loop ใช้เพื่อรันโค้ดซ้ำๆ เช่น. ทำซ้ำการเรียกใช้โค้ดหลาย ๆ ครั้งเท่าที่เป็นไปได้ตามที่ผู้ใช้กำหนด

ไวยากรณ์คือ:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

for loop ด้านล่างวนซ้ำถึง 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 ...)

ตัวอย่างเช่น คุณสามารถจัดเก็บคำสั่ง date ในตัวแปรชื่อ today และเรียกใช้เชลล์สคริปต์เพื่อแสดงวันที่ปัจจุบัน

#!/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

นี่เป็นการสิ้นสุดบทช่วยสอนของเราเกี่ยวกับการสร้างเชลล์สคริปต์อย่างง่าย เราหวังว่าคุณจะพบว่าสิ่งนี้มีคุณค่า