Pracical 10 ตอนที่ 1 ตัวอย่างโปรแกรมจาก Lect09.txt ---------------------------------- โปรแกรมที่ 1: พิมพ์โปรแกรมสำหรับแสดง command line arguments ต่อไปนี้ $ cat -n args.sh 1 #!/bin/bash 2 3 i=0 4 n=1 5 argv=("$@") 6 7 echo 'argument count, $# = ' $# 8 echo argument values: 9 while [ $i -lt $# ]; do 10 echo \$$n = ${argv[$i]} 11 i=$(($i + 1)) 12 n=$(expr $n + 1) 13 done ก. ทดลองให้โปรแกรมทำงาน โดยใช้คำสั่งดังนี้ $ args.sh aa bb cc ผลลัพธ์ที่ได้เป็นอย่างไร ผลลัพธ์แต่ละบรรทัดหมายความว่าอย่างไร ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ข. บรรทัดที่ 7 ของโปรแกรม กำกับข้อความที่ต้องการให้ echo แสดงด้วยเครื่องหมายคำพูดเดี่ยว (single quote), จงเปลี่ยนเป็นกำกับด้วย เครื่องหมายคำพูดคู่ บรรทัดที่เปลี่ยนแล้วและทำงานให้ผลลัพธ์เช่นเดิมคือ ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ค. แทรกคำสั่งต่อไปนี้ลงในบรรทัดที่ 6 6 echo $@ ผลลัพธ์ที่ได้เป็นอย่างไร ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ตัวแปร $@ เก็บข้อมูลใดไว้ ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ง. เปลี่ยนแทนคำสั่งในบรรทัดที่ 6 ด้วย 6 echo $* ผลลัพธ์ที่ได้เป็นอย่างไร ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ตัวแปร $@ และ $* เหมือนกัน หรือแตกต่างกันอย่างไร ... ... ... ... ... ... ... ... ... ... โปรแกรมที่ 2: โปรแกรมสำหรับสำรองข้อมูลที่มีการนำอาร์กิวเมนต์จากบรรทัดคำสั่งมาใช้ผ่าน positional parameters $ cat -n backup.sh 1 #!/bin/bash 2 OF=$1-backup-$(date +%Y-%m-%d).tgz # ใช้ตัวแปร $1 เป็นส่วนหนึ่งของชื่อแฟ้ม 3 tar -czvf $OF $2 # ใช้ตัวแปร $2 เป็นชื่อไดเรกทอรี ก. หากต้องการทดสอบการทำงานของโปรแกรมนี้ เช่น ต้องการสำรองข้อมูลของไดเรกทอรี ./tmp1 ด้วยคำสั่ง $ backup.sh $USER ./tmp1 จะต้องดำเนินการอย่างไร ควรมีแฟ้มใน ./tmp1 จำนวนเท่าใด และเป็นแฟ้มชนิดใด จึงจะแน่ใจได้ว่า script นี้ทำงานถูกต้องสมบูรณ์ ลำดับการทำงาน ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ข. หากทำการลบแฟ้มทั้งหมดและตัวไดเรกทอรี ./tmp1 หากต้องการ restore แฟ้มกลับมาจาก tar file ที่สำรองไว้ จะต้องใช้คำสั่งอย่างไร โปรแกรมที่ 3: โปรแกรมคัดลอกแฟ้มทั้งหมดในไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง โดยอาศัยการรวมแฟ้มในไดเรกทอรีต้นทาง ส่งผ่าน pipe ไปแตกออกเป็นแฟ้มยังไดเรกทอรีปลายทาง $ cat cpdir ( cd $1 ; tar -cf - . ) | ( cd $2 ; tar -xvf - . ) หากต้องการทดสอบการทำงานของโปรแกรมนี้ เช่น ต้องการคัดลอกแฟ้มทั้งหมดของไดเรกทอรี ./tmp1 ไปยังไดเรกทอรี ./tmp2 ด้วยคำสั่ง $ cpdir ./tmp1 ./tmp2 จะต้องจัดลำดับการทำงานอย่างไร ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ตอนที่ 2 - ตัวอย่างการประยุกต์ใช้งาน Exit status ------------------------------------------ ตัวอย่างการประยุกต์ใช้งาน exit status ต่อไปนี้ ทำในรูปของการทดลองที่ประกอบด้วยโปรแกรมภาษา C สั้นๆ 2 โปรแกรม และ shell script อีก 1 โปรแกรม $ cat -n hello.c 1 #include 2 3 int main ( void ) 4 { 5 printf("Hello"); 6 7 return 0; 8 } ทำการ compile โปรแกรมด้วย $ gcc -Wall hello.c -o hello $ cat -n world.c 1 #include 2 3 int main ( void ) 4 { 5 printf(" world!\n"); 6 7 return 0; 8 } ทำการ compile โปรแกรมด้วย $ gcc -Wall world.c -o world จากนั้นจึงเขียน script เพื่อเรียกให้โปรแกรม hello และ world ทำงานเป็นลำดับไป โดยมีเงื่อนไขว่าจะให้โปรแกรม world ทำงาน ก็ต่อเมื่อโปรแกรม hello ทำงานได้สำเร็จ หรือมี exit status เป็น 0 ดังนี้ $ cat -n seq1.sh 1 #!/bin/bash 2 3 hello 4 if [ $? = 0 ]; then # โปรแกรม world ทำงานสำเร็จ (หรือมี exit status เป็น 0)? 5 world # ใช่, ทำงานต่อโดยให้โปรแกรม world ทำงาน 6 else 7 echo # ไม่ใช่ แสดงความผิดพลาด 8 echo "Abnormal termination!" 9 fi เพิ่มสิทธิในการ execute ให้แก่เจ้าของ แล้วจึงให้ script ทำงาน $ seq1.sh Hello world! --> ผลลัพธ์ที่ได้แสดงว่าโปรแกรม hello และโปรแกรม world ทำงานต่อเนื่องกัน เมื่อ "เห็น" ผลลัพธ์และ "เข้าใจ" ความหมายชัดเจนแล้ว ให้ทำการเปลี่ยนบรรทัดที่ 7 ของโปรแกรม hello.c เป็น 7 return 1; ทำการ compile ใหม่ และเรียกให้ทำงานอีกครั้งหนึ่ง ผลลัพธ์เป็นอย่างไร? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ในกรณีที่คำสั่งหรือโปรแกรมแรกทำงานไม่สำเร็จ ต้องการให้ script แสดง exit status (หรือ exit code) ของคำสั่งแรกด้วย สามารถทำได้ โดยการรักษาค่าของตัวแปร $? ไว้ทันทีที่คำสั่งแรกทำงานจบลง เพราะ $? จะเก็บสถานะการทำงานของคำสั่ง ล่าสุุดเสมอ จึงต้องเก็บรักษาไว้ในตัวแปรอื่น ตัวอย่างนี้เป็นการเก็บไว้ในตัวแปร status $ cat -n seq2.sh 1 #!/bin/bash 2 3 hello 4 status=$? # รักษา exit status ของโปรแกรม hello, การรักษาค่าต้องทำทันที 5 if [ $status = '0' ]; then # เมื่อถึงบรรทัดนี้จะเป็น exit status ของการกำหนดค่าตัวแปรจากบรรทัดก่อน 6 world 7 else 8 echo 9 echo "Abnormal termination, exit code = $status" 10 fi เมื่อ compile, กำหนดสิทธิในการ execute และให้ทำงานอีกครั้งหนึ่งผลลัพธ์ที่ได้เป็นอย่างไร? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ตอนที่ 3: คำสั่ง true และ false ของเชลล์ ------------------------------------ $ cat bool1.sh 1 if [ false ]; then 2 echo "True" 3 else 4 echo "False" 5 fi เมื่อให้ script นี้ทำงาน ผลลัพธ์ที่ได้คือ ... ... ... ... ... ... ผลลัพธ์ที่ได้เป็นไปตามที่ตั้งใจไว้หรือไม่? หากไม่เป็น เพราเหตุใดจึงเป็นเช่นนั้น สรุปได้หรือไม่? สรุป ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... หากไม่สามารถสรุปได้ ให้อ่านจาก Lect10.txt แทนที่จะกำหนดค่าโดยตรง ทดลองเปลี่ยนเป็นการกำหนดค่าให้กับตัวแปร และนำตัวแปรมาใช้ $cat bool2.sh 1 var=false 2 if [ $var ]; then 3 echo "True" 4 else 5 echo "False" 6 fi เมื่อให้ script นี้ทำงาน ผลลัพธ์ที่ได้คือ ... ... ... ... ... ... ผลลัพธ์เปลี่ยนแปลงไปหรือไม่ เพราะเหตุใด ... ... ... ... ... ทดลองเปลี่ยนเป็นการใช้ true และ false โดยตรง ไม่ผ่านคำสั่ง test $ cat bool3.sh 1 if false ; then 2 echo "True" 3 else 4 echo "False" 5 fi เมื่อให้ script นี้ทำงาน ผลลัพธ์ที่ได้คือ ... ... ... ... ... ... ผลลัพธ์ที่ได้เป็นไปตามที่ตั้งใจไว้หรือไม่? สรุปความแตกต่างระหว่าง if false; และ if [ false ]; ได้หรือไม่ อย่างไร? สรุป ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ตอนที่ 4 transliteration ---------------------- นักคอมพิวเตอร์คนหนึ่งเข้ารักษาตัวในโรงพยาบาล เมื่อรักษาตัวจนหายดีแล้วและออกจากโรงพยาบาล ประสาทการทำงานยังสับสนอยู่มาก เมื่อใช้เครื่องคอมพิวเตอร์พิมพ์เอกสารภาษาอังกฤษ ปรากฏว่าเขากดแป้นพิมพ์เลื่อนไปทางขวาหนึ่งตำแหน่งเสมอ จากด้านซ้ายของแป้นพิมพ์ Q เป็น W, A เป็น S, Z เป็น X, แป้นพิมพ์แถวต่อไปก็เป็นเช่นเดียวกันจนถึงด้านขวาของแป้นพิมพ์จะได้ P เป็น [, L เป็น ; และ M เป็น < หากกำหนดให้เอกสารที่พิมพ์มีเฉพาะอักษรตัวใหญ่ และ เว้นวรรคซึ่งไม่มีการเลื่อนตำแหน่งเพราะเป็นแป้นที่มีความยาวมาก เอกสารที่พิมพ์บรรทัดหนึ่งเป็นดังนี้ TRHI;ST RC[TRDDOPM ข้อความที่นักคอมพิวเตอร์คนนั้นตั้งใจพิมพ์คือ REGULAR EXPRESSION จงแสดงวิธีวิเคราะห์และเขียนคำสั่งสำหรับถอดรหัสดังกล่าว ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...