10.เกร็ดอื่น ๆ

10.1 การสั่งรันสคริปต์และคำสั่ง source

การสั่งรันสคริปต์ในเชลล์ มีเกร็ดคือ

  • ถ้าเราใส่ชื่อสคริปต์พร้อมพาธ เชลล์จะค้นหาสคริปต์จากชื่อเต็มที่เราใส่ เช่น
    $ /bin/ls
  • ถ้าเราใส่ชื่อสคริปต์โดด ๆ เชลล์จะค้นหาสคริปต์จากตัวแปร $PATH โดยไม่สนใจไดเรกทอรีปัจจุบัน เช่น
    $ mycode

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

    $ ./mycode

เมื่อสคริปต์ถูกรันจนจบแล้ว ค่าของตัวแปรต่าง ๆ ในสคริปต์จะถูกลบไปด้วย ยกเว้นถ้าเราใช้คำสั่ง source หรือคำสั่ง . เชลล์จะรันคำสั่งนั้นโดยถือเสมือนเป็นสภาพแวดล้อมเดียวกัน ดังนั้นค่าตัวแปรต่าง ๆ ในสคริปต์จะยังคงค้างอยู่ในเชลล์ โดยเมื่อใช้คำสั่งนี้แล้ว การค้นหาสคริปต์ เชลล์จะค้นหาจากตัวแปร $PATH ก่อน ตามด้วยไดเรกทอรีปัจจุบันด้วย เช่น ถ้าสคริปต์ mycode มีเนื้อไฟล์เป็น

#!/bin/bash
ABC="This is new ABC"

ทดลองรันได้ดังนี้

$ ABC="Old ABC"
$ echo $ABC
Old ABC
$ ./mycode
$ echo $ABC
Old ABC
$ . mycode
$ echo $ABC
This is new ABC

10.2 การแทนค่าตัวเลข

เราใช้ $((ARITHMATIC)) หรือ $[ARITHMATIC] ในการแทนค่าตัวแปร ดังนี้

$ echo $(1+1)
bash: 1+1: command not found

$ echo 1+1
1+1
$ echo $((1+1))
2
$ echo $[1+1]
2

10.3 bash อยู่ที่ไหน

บรรทัดเริ่มต้นของสคริปต์ หลังเครื่องหมาย #! (hash-bang) เราต้องใส่พาธของโปรแกรม bash ให้เต็ม

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

$ which bash
$ whereis bash
$ find / -name bash

10.4 ดูค่าที่โปรแกรมส่งออกมา

หลายโปรแกรมของเชลล์มีการส่งค่าออกมา (Return value) อาจเพื่อแจ้งสถานะการรันว่ารันสำเร็จหรือไม่อย่างไร หรืออาจส่งออกเป็นค่าที่จะนำไปประมวลผลต่อก็ตาม เราสามารถใช้ตัวแปรพิเศษ $? ในการดูผลลัพธ์ของโปรแกรมได้ เช่น

#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?

กรณีนี้ ไดเรกทอรี /dada เป็นไดเรกทอรีที่เราแกล้งพิมพ์ผิดไว้ เพื่อดูว่าสคริปต์จะส่งออกค่าออกมาเป็นอย่างไร ซึ่งจะได้ผลออกมาเป็น 1 และ 0 ตามลำดับ คือ 1 หมายถึงมีข้อผิดพลาดในโปรแกรม และ 0 หมายถึงรันสำเร็จ ไม่มีข้อผิดพลาดใด ๆ

10.5 จับการแสดงผลใส่ตัวแปร

เราสามารถนำผลลัพธ์ของโปรแกรมมาใส่ในตัวแปร ด้วยการสั่งภายใต้เครื่องหมาย ` (grave accent) เช่น

#!/bin/bash
DBS=`mysql -u root  -e "show databases"`
for b in $DBS
do
    mysql -u root -e "show tables from $b"
done

เป็นการนำผลลัพธ์ของคำสั่งแรกคือ mysql -u root -e "show databases" มาใส่ในตัวแปร DBS เพื่อทำเป็นขอบเขตให้กับตัวแปร b ในคำสั่ง for อีกครั้งหนึ่ง

ตามตัวอย่างจะแสดงผลทุกตารางในทุกฐานข้อมูลของ mysql

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <pre> <blockquote> <img> <h3> <h4> <h5>
  • Lines and paragraphs break automatically.
  • E-Mail addresses are hidden with reCAPTCHA Mailhide.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.