การเขียนโปรแกรมเชลล์ (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)