เชลล์สคริปต์เบื้องต้น ตอนที่ 4 - ตัวแปรพิเศษ

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


วันก่อนพูดเรื่องตัวแปรสภาพแวดล้อมไปนี้วันนี้ขอพูดเรื่องตัวแปรพิเศษครับ.

ตัวแปรพิเศษ

ถ้าอ่าน man bash ในช่วงของ special parameters จะเห็นว่ามีตัวแปรพิเศษอยู่หลายตัว. ตัวแปรเหล่านี้โดยปรกติเชลล์จะเตรียมไว้ให้อยู่แล้วไม่ต้องสร้างเอง, และมักจะเป็นตัวแปรที่เปลี่ยนค่าไม่ได้ (read-only). ตัวแปรที่ใช้บ่อยและสำคัญๆได้แก่

  • $0, $1, $2, $3, ... ตัวแปรนี้เป็นตัวเลขใช้สำหรับอ้างอิงชื่อเชลล์สคริปต์และอาร์กิวเมนต์ของเชลล์สคริปต์เรียกว่า position parameter. ตัวอย่างเช่น
    #!/bin/sh
    # file: arg.sh
    echo $0 $1 $2
    
    $ ./arg.sh Hello again
    ./arg.sh Hello again
    

    $0 อ้างอิงชื่อเชลล์สคริปต์. $1 จะแทนอาร์กิวเมนต์ตัวแรกของสคริปต์, $2 แทนอาร์กิวเมนต์ตัวที่สองของสคริปต์ไปเรื่อยๆ.

  • $# ใช้บอกจำนวนอาร์กิวเมนต์.
  • $* แทนอาร์กิวเมนต์ของสคริปต์เรียงกันทั้งหมด "$1 $2 $3 ...". กรณีที่มีการตั้งแค่ตัวแปร IFS แสดงเป็น "$1$IFS$2$IFS...".
  • $@ คล้ายกับ $* แต่จะใช้ช่องว่างคั่นระหว่าง position parameter.
  • $? ตัวแปรแสดงสถานะการจบการทำงานของคำสั่งที่ผ่านล่าสุด. ถ้าคำสั่ง (โปรแกรม) จบการทำงานโดยบริบูรณ์จะมีค่าเป็น 0. ถ้าจบการทำงานโดยมี error ก็จะเป็นตัวเลขที่ไม่ใช่ 0 แล้วแต่กรณีแล้วแต่โปรแกรม. ตัวแปรนี้เอาเช็คว่าโปรแกรมที่สั่งไปทำงานถูกต้องหรือไม่. เช่น
    $ ls /etc/passwd
    $ echo $?
    0
    $ ls /etc/password
    ls: /etc/password: No such file or directory
    $ echo $?
    1
    
  • $! แสดงโปรเซส ID ของเชลล์ที่ทำงานอยู่.

ต่อไปนี้จะเป็นตัวแปรพิเศษที่อ่านแล้วเข้าใจได้ง่าย. ตัวแปรบางตัวอาจตัวค่าใหม่ได้.

  • $HOSTNAME ชื่อเครื่องที่ใช้งาน.
  • $PWD ไดเรกทอรีที่ทำงานอยู่.
  • $OLDPWD ไดเรกทอรีก่อนหน้าไดเรกทอรีปัจจุบัน.
  • $RANDOM ตัวเลขสุ่มระหว่าง 0 และ 32767.
  • $HOME โฮมไดเรกทอรี.
  • $PS1 ตัวแปรเก็บค่าพรอมต์หลัก (primary prompt)
  • $PS2 ตัวแปรเก็บค่าพรอมต์รอง (secondary prompt). ค่าโดยปริยายจะเป็น ">"
    $ for animal in Dog Cat Rat
    > do
    > echo $animal
    > done
    Dog
    Cat
    Rat
    

    ตามธรรมเนียมของ bash แล้วเชลล์พรอมต์ของยูสเซอร์ทั่วไปมักจะแทนด้วย "$" และสำหรับ root จะแทนด้วย "#".

การอ้างอิงตัวแปร

เรารู้แล้วว่าการอ้างอิงตัวแปรให้ใช้เครื่องหมาย "$" นำหน้าตัวแปรก็จะได้ค่าตัวแปร. มีบางกรณีที่เราต้องการอ้างอิงตัวแปรแล้วเขียนคำถัดจากตัวแปรเลยเช่น

$ a=temporary
$ echo $a.txt
temporary.txt

ในกรณีนี้จะไม่มีปัญหาอะไรเพราะเชลล์ตีความตัวแปรถึงแค่เครื่องหมาย "." คือเชลล์จะแทนค่า "$a" ด้วย "temporary" แล้วแสดงคำว่า ".txt" ตามทันที. แต่คำที่ต่อจากตัวแปรไม่ใช่จุดเช่น "_file", เชลล์จะตีความเป็นการอ้างอิงถึงตัวแปรชื่อ "a_file" ซึ่งไม่มีตัวตน (ว่างเปล่า). เพื่อความชัดเจนในกรณีนี้ให้ใช้เครื่องหมายวงเล็บปีกกาช่วยระบุช่วงของตัวแปรที่ต้องการแสดงตัวอย่างเช่น.

$ echo ${a}_file
temporary_file

หมายเหตุ

เครื่องหมาย "#" ใช้แสดงหมายเหตุ, เขียนไว้ตรงไหนในเชลล์สคริปต์ก็ได้ (ยกเว้นบรรทัดแรก). เชลล์จะถือว่าข้อความที่เขียนหลังเครื่องหมาย "#" จนสิ้นสุดบรรทัดเป็นหมายเหตุ (comment). เอาไว้ใช้เขียนบรรทึกในสคริปต์อธิบายสิ่งที่เขียน.

#!/bin/sh
#
# Filename: comment.sh
# This is a test script
#
echo Hello world! # This is a comment. Shell will ignore this.
$ ./comment.sh
Hello world!