สอนเขียน shellscript ตอนที่ 5 การรับอินพุตจากผู้ใช้

บทความนี้อยู่ในกลุ่มของบทความสอนเขียน shell script ซึ่ง shell script ที่จะสอนนั้นจะใช้ bash เป็น intepreter หรือตัวแปลภาษาครับ

การรับอินพุตจากผู้ใช้ใน  bash script มีด้วยกัน 2 รูปแบบดังนี้

  1. การรับอินพุตผ่าน พรอมต์ของผู้ใช้
  2. การรับอินพุตผ่าน อากิวเมนต์ ของไฟล์

การรับอินพุตจากพรอมต์ของผู้ใช้

คำสั่งของ bash ที่ใช้สร้างพรอมต์เพื่อรับอินพุตจากผู้ใช้คือคำสั่ง read  ลองดูตัวอย่างที่ผมรันใน shell prompt ตัวนี้ดูก่อนที่จะอธิบายในรายละเอียดครับ

จากรูปข้างต้น คำสั่ง

read  a

คือการรอรับค่าจากผู้ใช้ ซึ่งเมื่อเรารันคำสั่งนี้หน้าจอจะปรากฏพรอมต์(prompt) เพื่อรอรับอินพุตดังรูป

เมื่อเราอินพุตค่าเสร็จสิ้นและกด enter ข้อมูลที่เราอินพุตเข้าไปจะไปเก็บไว้ในตัวแปรชื่อ a
จากตัวอย่างข้างต้น จะเห็นว่าเราเก็บ 100 ไว้ในตัวแปรชื่อ a และ เก็บ 200 ไว้ในตัวแปรชื่อ b ตามลำดับ

คำสั่งถัดไป

echo $a  $b

เป็นคำสั่งในการแสดง ค่าของตัวแปร a และ b ตามลำดับ ในที่นี้ไม่ได้ใช้สัญลักษณ์คำพูด (quote)  ครอบตัวแปรทั้งสองไว้แต่จะมีความหมายเหมือนกับคำสั่ง  echo “$a  $b”  หรือ  echo ‘$a  $b’
คำสั่ง echo “$a+$b=$((a+b))”  ให้ผลลัพธ์เป็น

100+200=300

เนื่องจาก $((a+b)) เป็นการกระทำในรูปแบบของ AE (Arithematic Expression) ซึ่ง bash จะแปลความว่ามันเป็นการกระทำเชิงคณิตศาสตร์ดังนั้นผลลัพธ์ด้านในจึงเป็นการนำค่า 100 กับ 200 มาบวกกัน ก่อนรีเทิร์นค่าออกไปเป็นอินพุตของคำสั่ง echo

คำสั่ง read มีออปชั่นหลายตัว ผู้อ่านสามารถใช้คำสั่ง help  read เพื่อดูรูปแบบการใช้งานทั้งหมด ในที่นี้ผมขอยกมา 2 ตัวคือ -p และ -a

คำสั่ง read -p คือพิมพ์ข้อความของพรอมต์ก่อนรับอินพุตจากผู้ใช้ มีรูปแบบใช้งานดังนี้

read  -p  “ข้อความพรอมต์”   ชื่อตัวแปร

เช่น

read  -p   “please input number : ”  INPUT1

เป็นการแจ้งผู้ใช้ให้ใส่อินพุตเป็นหมายเลขและเก็บไว้ในตัวแปรชื่อ INPUT1 ซึ่งประโยคนี้จะมีความหมายเหมือนกับประ

echo -n  “please input number : ”
read  INPUT1

ซึ่ง read -p จะสื่อความหมายกับผู้ใช้และเป็นการลดบรรทัดในการเขียนสคริปต์ของเราได้

คำสั่ง read -a  เป็นการรับอินพุตจากผู้ใช้และเก็บไว้ในตัวแปรที่เป็นอาเรย์ มีรูปแบบการใช้งานดังนี้

read -a   ชื่อตัวแปร

เราสามารถใช้งาน -p และ -a ในคราวเดียวกันได้ดังรูป ผมจะรับอินพุตจากผู้ใช้ 3 จำนวนเก็บไว้ในตัวแปรชื่อ NUMS


ลองดูตัวอย่าง  shell script ต่อไปนี้ เป็นการหาค่า สูงสุด(MAX) และ ต่ำสุด(MIN) จากผู้ใช้ซึ่งจะใส่เลขกี่ตัวก็ได้ครับ

ผลจากการรัน 2 รอบครับ

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

Advertisements

14 thoughts on “สอนเขียน shellscript ตอนที่ 5 การรับอินพุตจากผู้ใช้

Add yours

    1. ใช้ modulo ( %) ด้วยเลข 2 ครับ ยกตัวอย่าง เขียนต่อข้างบนนะครับ

      let min_type=MIN%2
      let max_type=MAX%2
      
      if [ $min_type -eq 1 ] ; then
            echo "MIN is odd" ;
      else
             echo "MIN is even";
      fi
      
      if [ $max_type -eq 1 ] ; then
            echo "MAX is odd" ;
      else
             echo "MAX is even";
      fi
      
      

      ผลรันนะครับ

      ./min_max.sh
      start : 1 2 3 4 5 10
      MIN=1,MAX=10
      MIN is odd
      MAX is even
      
      1. แล้วถัาหากว่าเราอยากให้ข้อมูลแสดงออกมาเป็นแบบนี้ล่ะคะ?
        start : 1 2 3 4 5 6 7 8 9 10,
        MIN=1, MIN_ODD=1, MIN_EVEN=2
        MAX=10, MAX_ODD=9, MAX_EVEN=10

      2. คุณ yuiiii ถ้าอยากได้คำตอบแบบนั้นก็ต้องตรวจสอบทีละชุด เปรียบเทียบเลขคู่หรือเลขคี่ เพื่อความง่ายอาจจะเพิ่มตัวแปรมาเก็บค่า MIN ค่า MAX ของแต่ละแบบครับ แนะนำได้แค่นี้นะครับผม

  1. – อ่านรายชื่อของหนังสือเล่มนี้จากแฟ้ม
    – แสดงรายการ
    – ตัวเลือกแสดงเพื่อเพิ่มหนังสือมากขึ้น
    – เขียนรายชื่อใหม่ไปยังแฟ้ม
    เขียนโค้ด ได้อย่างไร ครับ

    1. เขียนโค้ดได้อย่างไร

      คุณ annan ถามแบบนี้ผมไปไม่เป็นเลย เอาเป็นว่าลองเขียนดูก่อนถ้าติดตรงไหนค่อยถามดีกว่านะครับ

    2. #!/bin/bash
      ADD=1
      CONT=1
      while [ $CONT == 1 ] ; do
      read -p “Choice ? (1=View, 2=Add book, 0=Exit) : ” CONT
      if [ $CONT == 1 ]; then
      echo “********************LIST OF BOOK*******************”
      while read line; do
      echo $line
      done >anan.sh
      echo “Name book :” ${Name_book} >>anan.sh
      echo “ISBN :” ${isbn} >>anan.sh
      echo “Price book:” ${price} “VND.” >>anan.sh

      read -p “Choice ? (1=View, 2=Add book, 0=Exit) : ” CONT
      done
      fi
      done

      การวนกลับมันขึ้นถามสองรอบครับอะครับทำไงให้มันถามรอบเดียวครับ

      Choice ? (1=View, 2=Add book, 0=Exit) : 1
      Choice ? (1=View, 2=Add book, 0=Exit) : 1

  2. #!/bin/bash
    ADD=1
    CONT=1
    while [ $CONT == 1 ] ; do
    read -p “Choice ? (1=View, 2=Add book, 0=Exit) : ” CONT

    if [ $CONT == 1 ]; then
    echo “********************LIST OF BOOK*******************”
    while read line; do
    echo $line
    done >anan.sh
    echo “Name book :” ${Name_book} >>anan.sh
    echo “ISBN :” ${isbn} >>anan.sh
    echo “Price book:” ${price} “VND.” >>anan.sh
    CONT=1
    elif [ $CONT == 0 ]; then
    echo “********************LIST OF BOOK*******************”
    while read line; do
    echo $line
    done < anan.sh
    echo "**************************************************"

    fi
    done

    ถ้าพิม 1 เเสดงข้อมูลทั้งหมดเเละกด 0 ไม่เเสดงข้อมูลซ้ำ แต่ถ้ากด 2 เพิ่มข้อมูลและกด 0 เพื่อออกให้เเสดงข้อมูลก่อนออกต้องเขียนโค๊ดได้อย่างไรครับ

  3. ขอ สอบถามหน่อยนะครับ เรื่อง shell script
    หาก อยากรับ ค่า argument เป็น ip address จากผู้ใช้
    [ $1 = ip address ]
    แล้วมันเปลี่ยนค่า ในไฟล์ interfaces ยังไงเหรอครับ

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

Up ↑

%d bloggers like this: