ตัวแปรตัวเลขใน Bash

Bash Scripting เบื้องต้น

Alex Scriven

Data Scientist

ตัวเลขในภาษาอื่น

Shell ไม่รองรับตัวเลขโดยตรงเหมือน REPL (คอนโซล) อย่าง R และ Python

ใน Python หรือ R สามารถทำได้:

>>> 1 + 4
5

ได้ผลลัพธ์ที่ต้องการเลย!

Bash Scripting เบื้องต้น

ตัวเลขใน Shell

 

ตัวเลขไม่ได้รับการรองรับโดยตรง:

(ในเทอร์มินัล)

1 + 4
bash: 1: command not found
Bash Scripting เบื้องต้น

แนะนำ expr

 

expr เป็นโปรแกรมยูทิลิตีที่มีประโยชน์ (เหมือนกับ cat หรือ grep)

วิธีนี้จะใช้งานได้ (ในเทอร์มินัล):

expr 1 + 4
5

ดีมาก!

Bash Scripting เบื้องต้น

ข้อจำกัดของ expr

expr ไม่รองรับทศนิยมโดยตรง:

(ในเทอร์มินัล)

expr 1 + 2.5
expr: not a decimal number: '2.5'

แต่ไม่ต้องกังวล! (มีวิธีแก้ไข)

Bash Scripting เบื้องต้น

แนะนำ bc

bc (basic calculator) เป็นโปรแกรม command-line ที่มีประโยชน์

เปิดใช้งานในเทอร์มินัลเพื่อคำนวณได้เลย:

การใช้โปรแกรม BC ใน shell

Bash Scripting เบื้องต้น

ส่งตัวเลขไปยัง bc

 

ใช้ bc โดยไม่ต้องเปิดเครื่องคิดเลขได้ด้วยการ pipe:

echo "5 + 7.5" | bc
12.5
Bash Scripting เบื้องต้น

อาร์กิวเมนต์ scale ของ bc

bc มีอาร์กิวเมนต์ scale สำหรับกำหนดจำนวนทศนิยม

echo "10 / 3" | bc
3
echo "scale=3; 10 / 3" | bc

สังเกตการใช้ ; เพื่อแบ่ง "บรรทัด" ในเทอร์มินัล

3.333
Bash Scripting เบื้องต้น

ตัวเลขใน Bash script

กำหนดตัวแปรตัวเลขได้เหมือนกับตัวแปรสตริง:

dog_name='Roger'
dog_age=6

echo "My dog's name is $dog_name and he is $dog_age years old"

ระวัง: dog_age="6" ใช้ได้ แต่จะกลายเป็นสตริง!

My dog's name is Roger and he is 6 years old
Bash Scripting เบื้องต้น

การใช้วงเล็บคู่

รูปแบบวงเล็บคู่สำหรับตัวแปรตัวเลข:

expr 5 + 7
echo $((5 + 7))
12
12

ระวัง: วิธีนี้ใช้ expr ไม่ใช่ bc (ไม่รองรับทศนิยม!)

Bash Scripting เบื้องต้น

Shell ภายใน Shell ทบทวนอีกครั้ง

จำที่เรียกใช้ shell ภายใน shell จากบทที่แล้วได้ไหม?

มีประโยชน์มากสำหรับตัวแปรตัวเลข:

model1=87.65
model2=89.20

echo "The total score is $(echo "$model1 + $model2" | bc)"
echo "The average score is $(echo "($model1 + $model2) / 2" | bc)"
The total score is 176.85
The average score is 88
Bash Scripting เบื้องต้น

มาฝึกกันเถอะ!

Bash Scripting เบื้องต้น

Preparing Video For Download...