Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Bash Variables: การประกาศ กำหนดค่า และการใช้งานอย่างมีประสิทธิภาพ

ในวิทยาการคอมพิวเตอร์ (และการคำนวณทั่วไป) ตัวแปร (Variable) คือตำแหน่งในหน่วยความจำที่เก็บข้อมูล Arbitrary ไว้ใช้ภายหลัง กล่าวคือ ภาชนะเก็บข้อมูลชั่วคราวสำหรับนำข้อมูลเข้าและออก ใน Bash Shell ข้อมูลนั้นอาจเป็นคำ (String) หรือตัวเลข (Integer)

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

นี่คือการสาธิต Bash Variable ที่คุณอาจใช้ทุกวันโดยไม่รู้ตัว ตัวแปร PS1 เก็บข้อมูลเกี่ยวกับลักษณะ Terminal Prompt ที่คุณต้องการ ตัวอย่าง ตั้งค่าเป็นเครื่องหมายเปอร์เซ็นต์ (%) โดยกำหนด PS1 ใหม่:

$ PS1="% "
%

บทความนี้เกี่ยวกับ Variables ใน Bash Shell บน Linux, BSD, Mac, หรือ Cygwin ผู้ใช้ PowerShell ของ Microsoft ควรอ่านบทความ Variables ใน PowerShell แทน

ตัวแปรใช้ทำอะไร?

การที่ต้องการ Variables ใน Bash ขึ้นอยู่กับสิ่งที่คุณทำใน Terminal บางคน Variables เป็นเครื่องมือสำคัญจัดการข้อมูล บางคนเป็นสะดวกเล็กน้อยชั่วคราว บางคนก็ไม่มีเลย

ที่จริง Variables เป็นเครื่องมือ ใช้เมื่อพบประโยชน์ หรือปล่อยไว้ในความสบายใจที่ OS จัดการอยู่แล้ว แตความรู้คือพลัง การเข้าใจ Variables ใน Bash นำไปสู่การแก้ปัญหาเชิงสร้างสรรค์ที่ไม่คาดคิด

วิธีตั้งค่าตัวแปร

ไม่ต้องการ Permission พิเศษ สร้างฟรี ใช้ฟรี ไม่เป็นอันตราย ใน Bash Shell (Linux และ Mac) ตั้งค่าได้โดยระบุชื่อตัวแปร แล้วกำหนดค่า ตัวอย่างสร้าง FOO ค่า /home/seth/Documents:

$ declare FOO="/home/seth/Documents"

Success แสดงไม่ออก อาจไม่มั่นใจว่า Set แล้ว ใช้ echo command ดูได้ โดยเติม Dollar Sign ($) หน้าตัวแปร เพื่อให้ Shell แทนค่า ห่อด้วย Braces และ Quotes จะ Preserve Special Characters (ในตัวอย่างนี้ไม่มี แต่นิสัยดีควรทำ):

$ echo "${FOO}"
/home/seth/Documents

การตั้งค่า Variable ทำบ่อย กระบวนการกลายเป็น Informal เมื่อ String ตามด้วย Equals (=) และค่า Bash สมมติว่ากำลัง Set Variable ทำให้ declare ไม่จำเป็น:

$ FOO="/home/seth/Documents"

Variables มักสื่อสารข้อมูลระหว่างระบบ ตัวอย่างนี้ไม่ค่อยมีประโยชน์ แต่ยังสื่อสารได้ เนื้อหา FOO เป็น File Path ใช้เป็น Shortcut ไป ~/Documents:

$ pwd
/home/seth
$ cd "${FOO}"
$ pwd
/home/seth/Documents

Variables เป็น String ที่ไม่ Reserved (รวม Integer และ Underscore) ไม่บังคับต้องพิมพ์ใหญ่ แต่มักพิมพ์ใหญ่เพื่อแยกแยะง่าย

วิธีล้างตัวแปร

ล้างตัวแปรด้วยคำสั่ง unset:

$ unset FOO
$ echo $FOO

ในทางปฏิบัติ ไม่มักจำเป็น Variables "ถูก" สร้างได้ แล้วทิ้งเมื่อไม่ต้องการ แต่อาจต้องการให้ Variable ว่าง เพื่อไม่ส่งข้อมูลผิดไปยัง Process อื่นที่อาจอ่าน Variable นั้น

สร้างตัวแปรใหม่พร้อมป้องกันการชนกัน

บางครั้งอาจคิดว่าตัวแปรถูก Set ไปแล้วโดยคุณหรือ Process หากไม่ต้องการ Override มี Syntax พิเศษ Set Variable ให้เป็นค่าเดิม ยกเว้นค่าเดิมว่าง

สมมติ FOO = /home/seth/Documents:

$ FOO=${FOO:-"bar"}
$ echo $FOO
/home/seth/Documents

Colon-dash :- ทำให้ declare ใช้ค่าเดิมเป็น Default ลอง Unset แล้วลองใหม่:

$ unset FOO
$ echo $FOO

$ FOO=${FOO:-"bar"}
$ echo $FOO
bar

ส่งตัวแปรไปยัง Child Process

เมื่อสร้าง Variable มันคือ Local Variable รู้จักเฉพาะ Shell ปัจจุบันเท่านั้น

ข้อจำกัด Scope นี้เป็นเจตนา Variables โดย дизайн มักเป็น Local Only เพื่อแบ่งปันข้อมูล על פי Need-to-know Basis หากสร้าง Variable เก็บ Password แบบ Clear Text โชคดีที่ System ไม่ให้ Remote Shell หรือ Rogue Daemon เข้าถึง

ใช้ตัวอย่างแรก เปลี่ยน Prompt แล้วเปิด Shell ใหม่ภายใน Shell ปัจจุบัน:

$ PS1="% "
% bash
$

เปิด Shell ใหม่ ค่า PS1 ใหม่กลายเป็น Default Prompt แทน Prompt ที่กำหนดเอง Child Process ไม่สืบทอด Variable ที่ตั้งใน Parent หาก Kill Child Process จะกลับไป Parent Shell และเห็น Prompt PS1 เดิม:

$ exit
%

หากต้องการส่ง Variable ไป Child Process สามารถ Prepend คำสั่งด้วยการกำหนด Variable หรือ Export Variable ไปยัง Child Process

Prepending Variables

สามารถ Prepend Variables จำนวนมากก่อนรันคำสั่ง ไม่ว่าจะ Child Process ใช้หรือไม่ ขึ้นอยู่กับ Process แต่ส่ง Variables ให้ได้เสมอ:

$ FOO=123 bash
$ echo $FOO
123
$

Prepending มีประโยชน์เมื่อรันแอปที่ต้องการตำแหน่งพิเศษสำหรับ Library (ใช้ LD_LIBRARY_PATH) หรือ Compile Software ด้วย Compiler ไม่มาตรฐาน (ใช้ CC) ฯลฯ

Exporting Variables

อีกวิธีทำให้ Variable ใช้ได้ใน Child Process คือ Keyword export คำสั่ง Built-in ของ Bash export ขยาย Scope ของ Variable ที่ระบุ:

$ PS1="% "
$ FOO=123
$ export PS1
$ export FOO
% bash
% echo $PS1
%
% echo $FOO
123

ทั้งสองกรณี ไม่ใช่แค่ Child Shell ที่เข้าถึง Local Variable ที่ส่งหรือ Export ได้ แต่วัน Child Process ของ Shell นั้นด้วย สามารถ Launch Application จาก Shell เดียวกัน และ Variable นั้นพร้อมใช้เป็น Environment Variable ภายใน Application

Variables ที่ Export ไว้ให้ทุกอย่างในระบบใช้ เรียกว่า Environment Variables หัวข้อสำหรับบทความหน้า ตอนลองใช้ Variables สำหรับงานประจำวันดูว่าช่วย Workflow ได้อย่างไร