คู่มือเริ่มต้นของ Shell Scripting 2: สำหรับลูป

สารบัญ:

วีดีโอ: คู่มือเริ่มต้นของ Shell Scripting 2: สำหรับลูป

วีดีโอ: คู่มือเริ่มต้นของ Shell Scripting 2: สำหรับลูป
วีดีโอ: EP.81*5ปัญหาที่เกิดกับจอ แอนดรอยด์(Android)มากที่สุดวิธีแก้ปัญหาแบบระเอียดทุกขั้นตอน AndroidV.8/9/10 2024, มีนาคม
คู่มือเริ่มต้นของ Shell Scripting 2: สำหรับลูป
คู่มือเริ่มต้นของ Shell Scripting 2: สำหรับลูป
Anonim
ถ้าคุณต้องการที่จะสร้างความเชื่อมั่น geek ของคุณร่วมกับเราสำหรับงวดที่สองในชุดสคริปต์ของเราเชลล์ เรามีการแก้ไขไม่กี่รายการการปรับปรุงสคริปต์ในสัปดาห์ที่ผ่านมาและคำแนะนำในการวนซ้ำสำหรับคนที่ไม่ได้ฝึกหัด
ถ้าคุณต้องการที่จะสร้างความเชื่อมั่น geek ของคุณร่วมกับเราสำหรับงวดที่สองในชุดสคริปต์ของเราเชลล์ เรามีการแก้ไขไม่กี่รายการการปรับปรุงสคริปต์ในสัปดาห์ที่ผ่านมาและคำแนะนำในการวนซ้ำสำหรับคนที่ไม่ได้ฝึกหัด

ตรวจสอบสคริปต์สคริปต์ datecp แล้ว

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

ซามูเอลดิออนน์ - เรียลชี้ให้เห็นว่ามีวิธีที่ดีกว่าในการจัดการกับการอ้างอิงตัวแปรของเรา

Arguments are space-separated in the bash shell, it will tokenize when there is a space in the resulted expanded command. In your script,

cp $1 $2.$date_formatted

จะทำงานได้ตามที่ตั้งใจตราบใดที่ตัวแปรที่ขยายตัวไม่มีช่องว่างอยู่ ถ้าคุณเรียกสคริปต์ของคุณด้วยวิธีนี้:

datecp 'my old name' 'my new name'

การขยายตัวจะทำให้คำสั่งนี้:

cp my new name my old name.the_date

ซึ่งมีข้อโต้แย้งอยู่ 6 ข้อ

เพื่อแก้ไขปัญหานี้อย่างถูกต้องบรรทัดสุดท้ายของสคริปต์ควรเป็น:

cp '$1' '$2.$date_formatted'

อย่างที่คุณเห็นเปลี่ยนบรรทัดของสคริปต์จาก:

cp -iv $1 $2.$date_formatted

ไปที่:

cp -iv “$1” “$2”.$date_formatted

จะดูแลปัญหานี้เมื่อใช้สคริปต์ในไฟล์ที่มีช่องว่างในชื่อ ซามูเอลยังชี้ให้เห็นว่าเมื่อคัดลอกและวางโค้ดจากไซต์นี้ (หรืออินเทอร์เน็ตโดยทั่วไป) ให้แน่ใจว่าได้ใส่เครื่องหมายขีดกลางและเครื่องหมายคำพูดที่เหมาะสมสำหรับ "พิมพ์ดีด" ที่มักจะแทนที่ นอกจากนี้เราจะทำอะไรเพิ่มเติมเพื่อให้แน่ใจว่าโค้ดของเรามีความถูกต้องในการคัดลอก / วางมากขึ้น;-)

อีกคนหนึ่งคือ Myles Braithwaite ตัดสินใจขยายสคริปต์ของเราเพื่อให้วันที่ปรากฏขึ้นก่อนนามสกุลไฟล์ ดังนั้นแทนที่จะเป็น

tastyfile.mp3.07_14_11-12.34.56

เราจะได้รับนี้:

tastyfile.07_14_11-12.34.56.mp3

ซึ่งช่วยให้ผู้ใช้ส่วนใหญ่สะดวกยิ่งขึ้น รหัสของเขามีอยู่ที่หน้า GitHub ลองมาดูสิ่งที่เขาใช้เพื่อดึงชื่อไฟล์

date_formatted=$(date +%Y-%m-%d_%H.%M%S) file_extension=$(echo “$1″|awk -F. ‘{print $NF}’) file_name=$(basename $1.$file_extension)

cp -iv $1 $file_name-$date_formatted.$file_extension

ฉันได้เปลี่ยนการจัดรูปแบบบิต แต่คุณสามารถเห็นได้ว่า Myles ประกาศฟังก์ชันวันที่ในบรรทัดที่ 1 ในบรรทัดที่ 2 อย่างไรก็ตามเขาใช้คำสั่ง "echo" กับอาร์กิวเมนต์แรกของสคริปต์เพื่อส่งออกชื่อไฟล์ เขาใช้คำสั่งท่อที่เอาท์พุทที่และใช้เป็นข้อมูลสำหรับส่วนถัดไป หลังจากที่ท่อ Myles เรียกใช้คำสั่ง "awk" ซึ่งเป็นโปรแกรมสแกนรูปแบบที่มีประสิทธิภาพ ใช้คำสั่ง -F flag เขาบอกคำสั่งว่าอักขระถัดไป (หลังเว้นวรรค) เป็นสิ่งที่กำหนดให้กับ "field separator" ในกรณีนี้คือช่วงเวลา

ตอนนี้ awk เห็นไฟล์ชื่อ "tastyfile.mp3" ว่าประกอบด้วย 2 ช่องคือ "tastyfile" และ "mp3" สุดท้ายเขาใช้

‘{print $NF}’

เพื่อแสดงฟิลด์สุดท้าย ในกรณีที่ไฟล์ของคุณมีหลายช่วงเวลา - ดังนั้นการทำให้ awk เห็นฟิลด์ต่างๆ - จะแสดงเฉพาะไฟล์สุดท้ายซึ่งเป็นส่วนขยายของไฟล์

ในบรรทัดที่ 3 เขาสร้างตัวแปรใหม่สำหรับชื่อไฟล์และใช้คำสั่ง "basename" เพื่ออ้างอิงทุกอย่างใน $ 1 ยกเว้น นามสกุลไฟล์ นี้จะกระทำโดยใช้ basename และให้มัน $ 1 เป็นอาร์กิวเมนต์ของตนแล้วเพิ่มช่องว่างและนามสกุลไฟล์ ส่วนขยายของไฟล์ถูกเพิ่มโดยอัตโนมัติเนื่องจากตัวแปรที่อ้างถึงบรรทัดที่ 2 สิ่งที่จะทำคือใช้เวลา

tastyfile.mp3

และเลี้ยวเข้าไป

tastyfile

แล้วในบรรทัดสุดท้าย Myles ใส่คำสั่งที่จะส่งออกทุกอย่างตามลำดับ โปรดทราบว่าไม่มีการอ้างอิงถึง $ 2 อาร์กิวเมนต์ที่สองสำหรับสคริปต์ สคริปต์นี้จะคัดลอกไฟล์ดังกล่าวลงในไดเรกทอรีปัจจุบันของคุณแทน งานที่ดีซามูเอลและไมลส์!

เรียกใช้สคริปและเส้นทาง $

เรายังกล่าวถึงในบทความพื้นฐานของเราว่าสคริปต์นี้ไม่ได้รับอนุญาตให้อ้างอิงเป็นคำสั่งตามค่าเริ่มต้น นั่นคือคุณต้องชี้ไปที่เส้นทางของสคริปต์เพื่อที่จะรัน:

./script

~/bin/script

แต่โดยการวางสคริปต์ใน ~ / bin / คุณสามารถพิมพ์ชื่อจากที่ใดก็ได้เพื่อเรียกใช้

ผู้แสดงความคิดเห็นใช้เวลาถกเถียงกันถึงความเหมาะสมของวิธีนี้เนื่องจากไม่มี distro Linux แบบใหม่ที่สร้างไดเรกทอรีดังกล่าวตามค่าเริ่มต้น นอกจากนี้ไม่มีใครเพิ่มตัวแปรตัวแปร $ PATH ตามค่าดีฟอลต์อย่างใดอย่างหนึ่งซึ่งเป็นสิ่งที่ต้องใช้เพื่อให้สคริปต์ทำงานเหมือนกับคำสั่ง ฉันงงงวยเพราะหลังจากตรวจสอบตัวแปร $ PATH ผู้แสดงความคิดเห็นถูกต้อง แต่เรียกสคริปต์ยังคงทำงานให้ฉัน ฉันพบว่าทำไมหลาย distro Linux ทันสมัยสร้างแฟ้มพิเศษในไดเรกทอรีบ้านของผู้ใช้ -.profile

ไฟล์นี้อ่านได้โดย bash (เว้นแต่. bash_profile มีอยู่ในโฮมไดเร็กทอรีของผู้ใช้) และด้านล่างมีส่วนที่เพิ่มโฟลเดอร์ ~ / bin / ไปยังตัวแปร $ PATH ถ้ามีอยู่ ดังนั้นความลึกลับที่ถูกล้างขึ้น สำหรับชุดที่เหลือฉันจะยังคงวางสคริปในไดเร็กทอรี ~ / bin / เพราะเป็นสคริปต์ของผู้ใช้และผู้ใช้สามารถเรียกใช้งานได้ และดูเหมือนว่าเราไม่จำเป็นต้องยุ่งเกี่ยวกับตัวแปร $ PATH ด้วยมือเพื่อให้ทำงานได้ดี
ไฟล์นี้อ่านได้โดย bash (เว้นแต่. bash_profile มีอยู่ในโฮมไดเร็กทอรีของผู้ใช้) และด้านล่างมีส่วนที่เพิ่มโฟลเดอร์ ~ / bin / ไปยังตัวแปร $ PATH ถ้ามีอยู่ ดังนั้นความลึกลับที่ถูกล้างขึ้น สำหรับชุดที่เหลือฉันจะยังคงวางสคริปในไดเร็กทอรี ~ / bin / เพราะเป็นสคริปต์ของผู้ใช้และผู้ใช้สามารถเรียกใช้งานได้ และดูเหมือนว่าเราไม่จำเป็นต้องยุ่งเกี่ยวกับตัวแปร $ PATH ด้วยมือเพื่อให้ทำงานได้ดี

การทำซ้ำคำสั่งด้วยลูป

ลองไปที่เครื่องมือที่มีประโยชน์มากที่สุดแห่งหนึ่งในคลังแสง geek เพื่อจัดการกับงานที่ทำซ้ำ ๆ: ลูป วันนี้เราจะพูดถึงเรื่อง "for" loops

เค้าร่างพื้นฐานของวงสำหรับเป็นดังนี้:

for VARIABLE in LIST; do command1 command2 … commandn done

VARIABLE สามารถเป็นตัวแปรได้ แต่ส่วนใหญ่มักใช้ตัวพิมพ์เล็ก "i" ตามอนุสัญญา รายการคือรายการของรายการ (แยกด้วยช่องว่าง) ชี้ไปที่ไฟล์ข้อความภายนอกหรือใช้เครื่องหมายดอกจัน (*) เพื่อแสดงไฟล์ใด ๆ ในไดเร็กทอรีปัจจุบัน คำสั่งที่ระบุไว้จะเว้นไว้โดยการประชุมดังนั้นจึงง่ายกว่าที่จะเห็นการทำรัง - การวางลูปในลูป (เพื่อให้คุณสามารถวนลูปในขณะที่คุณ)

เนื่องจากรายการใช้ช่องว่างเป็นตัวคั่น - นั่นคือพื้นที่หมายถึงการย้ายไปยังรายการถัดไปในรายการ - ไฟล์ที่มีช่องว่างในชื่อไม่เป็นมิตรมาก ตอนนี้เรามาทำงานกับไฟล์โดยไม่ต้องเว้นวรรคเริ่มต้นด้วยสคริปต์ง่ายๆเพื่อแสดงชื่อของไฟล์ในไดเร็กทอรีปัจจุบัน สร้างสคริปต์ใหม่ในโฟลเดอร์ ~ / bin / ชื่อ "loopscript" หากคุณจำไม่ได้ว่าจะทำอย่างไร (รวมถึงการทำเครื่องหมายว่าเป็นไฟล์ปฏิบัติการและการเพิ่มแฮชแฮช) ให้ดูที่บทความพื้นฐานเกี่ยวกับการเขียนสคริปต์ bash ของเรา

ใส่รหัสต่อไปนี้:

for i in item1 item2 item3 item4 item5 item6; do echo “$i” done

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

for i in *; do echo “$i” done

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

for i in $@; do zip archive “$i” done

มีอะไรใหม่ ๆ ! "$ @" เป็นทางลัดสำหรับ "$ 1 $ 2 $ 3 … $ n" กล่าวอีกนัยหนึ่งนี่คือรายการอาร์กิวเมนต์ทั้งหมดที่คุณระบุ ตอนนี้ดูสิ่งที่เกิดขึ้นเมื่อฉันเรียกใช้สคริปต์ด้วยไฟล์อินพุตหลายรายการ
มีอะไรใหม่ ๆ ! "$ @" เป็นทางลัดสำหรับ "$ 1 $ 2 $ 3 … $ n" กล่าวอีกนัยหนึ่งนี่คือรายการอาร์กิวเมนต์ทั้งหมดที่คุณระบุ ตอนนี้ดูสิ่งที่เกิดขึ้นเมื่อฉันเรียกใช้สคริปต์ด้วยไฟล์อินพุตหลายรายการ
คุณสามารถดูไฟล์ที่อยู่ในโฟลเดอร์ของฉัน ฉันรันคำสั่งด้วยอาร์กิวเมนต์ 6 รายการและไฟล์แต่ละไฟล์ถูกเพิ่มลงในที่เก็บถาวร zip ชื่อ "archive.zip" ง่ายใช่มั้ย?
คุณสามารถดูไฟล์ที่อยู่ในโฟลเดอร์ของฉัน ฉันรันคำสั่งด้วยอาร์กิวเมนต์ 6 รายการและไฟล์แต่ละไฟล์ถูกเพิ่มลงในที่เก็บถาวร zip ชื่อ "archive.zip" ง่ายใช่มั้ย?

สำหรับลูปสวยมาก ตอนนี้คุณสามารถเรียกใช้ฟังก์ชันแบทช์ในรายการไฟล์ได้ ตัวอย่างเช่นคุณสามารถคัดลอกอาร์กิวเมนต์ของสคริปต์ทั้งหมดลงในที่เก็บถาวรแบบซิปให้ย้ายต้นฉบับไปยังโฟลเดอร์อื่นและปลอดภัยโดยอัตโนมัติในการคัดลอกไฟล์ zip นั้นไปยังคอมพิวเตอร์ระยะไกล ถ้าคุณตั้งค่าไฟล์สำคัญกับ SSH คุณจะไม่จำเป็นต้องใส่รหัสผ่านของคุณและคุณยังสามารถบอกสคริปต์เพื่อลบไฟล์ซิปหลังจากอัพโหลดได้!

การใช้ for-loops ทำให้ง่ายต่อการทำพวงของการกระทำสำหรับไฟล์ทั้งหมดในไดเร็กทอรี คุณสามารถใช้คำสั่งต่างๆร่วมกันและใช้อาร์กิวเมนต์ได้อย่างง่ายดายเพื่อสร้างและใช้งานได้ทันทีและนี่เป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็งเท่านั้น

สคริปต์ Bash คุณมีคำแนะนำหรือไม่? คุณได้สร้างสคริปต์ที่มีประโยชน์ซึ่งใช้ลูปหรือไม่? ต้องการแชร์ความคิดเห็นเกี่ยวกับซีรีส์นี้หรือไม่? ฝากความคิดเห็นบางส่วนและช่วยเหลือผู้อื่นในสคริปต์ใหม่ ๆ !

แนะนำ: