การเขียนโปรแกรมเชลล์ (5)
ตัวแปรเชลล์
ตัวแปรเชลล์จะมีการเก็บค่าไว้ในลักษณะของสตริง ในกรณีที่จะใช้งานเป็นลักษณะของตัวเลข จะต้องใช้โปรแกรม "expr" เข้ามาช่วย การกำหนดค่าให้กับตัวแปรจะถือว่าเป็นการประกาศตัวแปรด้วยซึ่งจะมีรูปแบบดังต่อไปนี้
ชื่อตัวแปร=ค่าตัวแปร
โดยห้ามมีช่องว่าง (space) คั่นระหว่างเครื่องหมายเท่ากับ ตัวอย่างเช่น
NAME=KLAUSE
หากมีการกำหนดค่าที่เป็นประโยคข้อความยาวๆที่มีช่องว่างอยู่ในประโยคนั้น จะต้องใช้เครื่องหมายเขาคู่ครอบประโยคนั้นเช่น
NAME="Peter Klause"
การตั้งชื่อของตัวแปรสามารถใช้ตัวอักษร ตัวเลข ตัวขีดเส้นใต้ ห้ามใช้ตัวอักษรพิเศษต่างๆเช่น $, *, #, () และห้ามขึ้นต้นด้วยตัวเลข ตัวอย่างชื่อตัวแปรเช่น VAR1, VAR_NAME, Variable แต่โดยทั่วไปแล้วการตั้งชื่อของตัวแปรมักจะใช้ตัวอักษรตัวใหญ่ในการตั้งชื่อการใช้งานตัวแปรเชลล์หรือการอ้างถึงค่าของตัวแปรนั้นจะต้องใช้เครื่องหมาย "$" นำหน้าตัวแปรนั้น เช่นถ้าใช้คำสั่ง
$ echo $NAME
ในกรณีที่กำหนดค่าของตัวแปรเป็น "Peter Klause" จะได้ผลลัพธ์เป็น Peter Klause
แต่ถ้าใช้คำสั่ง
$ echo NAME
เนื่องจากไม่ได้อ้างถึงค่าของตัวแปร ดังนั้นจะได้ผลลัพธ์เป็น
NAME
ในกรณีที่จะทำให้เชลล์สามารถแยกชื่อของตัวแปรออกจากค่าอื่นๆเราสามารถทำได้โดย
ทำการครอบชื่อของตัวแปรนั้นด้วยเครื่องหมายปีกกา "{}"
ดังตัวอย่าง
$ MYDIR=/home/mary/
$ cat ${MYDIR}myfile
คำสั่งข้างต้นเป็นการสั่งให้ทำการพิมพ์รายละเอียดของแฟ้มที่ชื่อ /home/mary/myfile
(ซึ่งเป็นการเอาค่าของตัวแปร (/home/mary/) มาต่อกับชื่อไฟล์ (myfile) )
ออกมาให้ หากเราไม่ครอบชื่อของตัวแปรด้วยเครื่องหมายปีกกาแล้วเชลล์จะมองชื่อตัวแปร
เป็น $MYDIRmyfile (ซึ่งไม่มีค่าอะไรอยู่) ไม่ใช่ $MYDIR ตามที่เราต้องการ
การยกเลิกตัวแปรสามารถทำได้โดยใช้คำสั่ง
$ unset ชื่อตัวแปร
ขอบเขตของตัวแปรเชลล์
ตัวแปรเชลล์ที่ถูกกำหนดขึ้นมาจะมีลักษณะเป็น ตัวแปรท้องถิ่น ซึ่งจะรู้จักแต่เฉพาะในเชลล์ของชั้นตนเองเท่านั้น เชลล์ในชั้นอื่นๆจะไม่รู้จักตัวแปรดังกล่าวจนกว่าเราได้ทำการประกาศตัวแปรให้เชลล์ชั้นอื่นๆได้รู้จัก ซึ่งสามารถทำได้โดยใช้คำสั่ง "export"
การเรียกเชลล์ซ้อนกันหลายชั้น หรือซับเชลล์ (sub shell) นั้นหมายถึงเราพิมพ์คำสั่ง "sh" หรือ "ksh" ซึ่งจะเป็นการเรียกโบนเชลล์ และคอร์นเชลล์ซ้อนขึ้นมาจากเชลล์ปัจจุบัน เมื่อเรียกขึ้นมาแล้วจะเห็นเป็นเครื่องหมายพร้อมพต์ของระบบตามปกติ ซึ่งจะหมายความว่าซับเชลล์ได้ถูกเรียกขึ้นมาใหม่แล้ว เราอาจใช้คำสั่ง "ps" เพื่อตรวจดูว่าซับเชลล์ถูกเรียกขึ้นมาหรือไม่
$ ps
PID TTY STAT TIME COMMAND
962 p2 S 0:00 login -h localhost -p
963 p2 S 0:00 -bash
974 p2 R 0:00 ps
ตัวอย่างเชลล์แรกที่ลีนุกซ์กำหนดไว้ให้เมื่อทำการล็อกอินเข้ามาใช้ระบบครั้งแรกคือ bourn again shell (bash) ซึ่งเป็นโพรเซสหมายเลข 963
$ sh
$ ps
PID TTY STAT TIME COMMAND
962 p2 S 0:00 login -h localhost -p
963 p2 S 0:00 -bash
975 p2 S 0:00 sh
976 p2 R 0:00 ps
เมื่อทำการเรียกซับเชลล์จะเห็นโพรเซสหมายเลข 975 ซึ่งเป็นโพรเซสของโบนเชลล์ที่เราได้ทำการเรียกด้วยคำสั่ง "sh" ขึ้นมา
$ exit
exit
$ ps
PID TTY STAT TIME COMMAND
962 p2 S 0:00 login -h localhost -p
963 p2 S 0:00 -bash
989 p2 R 0:00 ps
เราสามารถออกจากซับเชลล์ได้โดยการพิมพ์คำสั่ง "exit" ตามปกติ เมื่อใช้คำสั่ง exit เพื่อออกจากซับเชลล์ จะเห็นว่าโพรเซสของโบนเชลล์จะหายไปเนื่องจากถูก kill ด้วยคำสั่ง exit ไปแล้ว แสดงว่าตอนนี้เราได้กลับมาอยู่ที่เชลล์แรกซึ่งก็คือ bourn again shell (bash) อีกครั้ง (โพรเซสหมายเลข 963)
ตัวอย่างการเรียกซับเชลล์และการประกาศตัวแปรให้เชลล์ชั้นอื่นๆได้รู้จัก
$ NAME=KLAUSE : ประกาศตัวแปร NAME ในเชลล์ชั้นปัจจุบัน
$ sh : เรียกซับเชลล์ซ้อนขึ้นมา
$ echo $NAME : ไม่พิมพ์ผลลัพธ์ใดๆออกมา เนื่องจากซับเชลล์ไม่รู้จัก
$ exit : ออกจากซับเชลล์ กลับมาสู่เชลล์ปัจจุบัน
$ export NAME : ประกาศตัวแปร NAME ให้กับเชลล์ชั้นอื่นๆ
$ sh : เรียกซับเชลล์อีกครั้งหนึ่ง
$ echo $NAME :
KLAUSE : คราวนี้ซับเชลล์รับรู้ตัวแปร NAME แล้ว จึงพิมพ์ผลลัพธ์
: ออกมาให้
$ readonly NAME : คำสั่งนี้จะทำให้ไม่สามารถเปลี่ยนแปลงค่าตัวแปร
ตัวแปรสงวน หรือตัวแปรของระบบ
ในระบบลีนุกซ์และยูนิกซ์จะมีตัวแปรสงวนที่ตัวโอเอสจะนำไปใช้ประโยชน์โดยเฉพาะเท่านั้น แต่หากเรารู้ความหมายของตัวแปรเหล่านั้นเราก็สามารถแก้ไขเปลี่ยนแปลงค่าของตัวแปรดังกล่าวได้ เราสามารถตรวจสอบค่าของตัวแปรระบบได้โดยใช้คำสั่ง
$ set
PPID=373
PS1=$
PS2=>
PS4=+
PWD=/home/twg
SHELL=/bin/bash
SHLVL=1
TERM=xterm
UID=406
USER=twg
WINDOWID=37748749
_=set
i=/etc/profile.d/mh.sh
เราจะเห็นระบบแสดงรายละเอียดของชื่อและค่าของตัวแปรสงวนต่างๆ ออกมาให้่ต่อไปนี้เป็นคำอธิบายของตัวแปรสงวนบางตัวแปร
$HOME : Home directory
$PATH : search patch เมื่อสั่งเรียกโปรแกรมให้ทำงาน
: ระบบจะทำการค้นหาตัวโปรแกรมนั้นจากรายชื่อของ
: ไดเรกทอรีที่ได้กำหนดไว้ในตัวแปรนี้
$MAIL : mailbox
$PS1 : พร้อมพต์ตัวที่ 1 ของเชลล์
$PS2 : พร้อมพต์ตัวที่ 2 ของเชลล์
$LOGNAME : ชื่อทะเบียนผู้ใช้ระบบ (login name)
$TERM : ชนิดของจอ (ในที่นี้เป็น xterm)
นอกจากการใช้คำสั่ง "set" เพื่อแสดงรายชื่อและค่าของตัวแปรต่างๆออกมาแล้วเรายังสามารถใช้คำสั่ง "echo <ชื่อตัวแปร>" เพื่อแสดงค่าของตัวแปรดังกล่าวออกมาก็ได้เช่นกัน และการเปลี่ยนหรือกำหนดค่าให้กับตัวแปรก็สามารถทำได้เช่นเดียวกับตัวแปรเชลล์ปกติทั่วไป ดังตัวอย่าง
$ echo $PS1 : ให้แสดงค่าของตัวแปร PS1 (พร้อมพต์ของระบบ)
$ : ระบบพิมพ์ตัวอักษร "$" ซึ่งถูกใช้เป็นพร้อมพต์ออกมาให้
$ PS1="Linux:> " : กำหนดค่าของพร้อมพต์ใหม่เป็น "Linux:> "
Linux:> : พร้อมพต์ของระบบถูกเปลี่ยนเป็น "Linux:> "
HTML developed by Kaiwal Development Team (kaiwal@geocities.com)