Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

การใช้ตัวแปรใน Bash

ในวิทยาการคอมพิวเตอร์ (และการคำนวณแบบไม่เป็นทางการ) ตัวแปรคือตำแหน่งในหน่วยความจำที่เก็บข้อมูลตามอำเภอใจเพื่อใช้ในภายหลัง กล่าวคือเป็นที่เก็บชั่วคราวเพื่อให้คุณใส่ข้อมูลและดึงข้อมูลออก ใน Bash shell ข้อมูลนั้นสามารถเป็นคำได้ (a string , ในภาษาคอมพิวเตอร์) หรือตัวเลข (จำนวนเต็ม )

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

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

$ PS1="% "
%

บทความนี้กล่าวถึงตัวแปรใน Bash shell ที่ทำงานบน Linux, BSD, Mac หรือ Cygwin ผู้ใช้ PowerShell โอเพ่นซอร์สของ Microsoft ควรอ้างอิงบทความของฉันเกี่ยวกับตัวแปรใน PowerShell

ตัวแปรมีไว้เพื่ออะไร

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

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

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

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

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

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

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

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

$ FOO="/home/seth/Documents"

ตัวแปรมักจะหมายถึงการถ่ายทอดข้อมูลจากระบบหนึ่งไปยังอีกระบบหนึ่ง ในตัวอย่างง่ายๆ นี้ ตัวแปรของคุณไม่ได้มีประโยชน์มากนัก แต่ก็ยังสามารถสื่อสารข้อมูลได้ ตัวอย่างเช่น เนื่องจากเนื้อหาของ FOO ตัวแปรคือเส้นทางของไฟล์ คุณสามารถใช้ตัวแปรเป็นทางลัดไปยัง ~/Documents ไดเรกทอรี:

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

ตัวแปรสามารถเป็นสตริงที่ไม่สงวนไว้ (พร้อมกับจำนวนเต็มและขีดล่าง) ไม่จำเป็นต้องเป็นตัวพิมพ์ใหญ่ แต่มักใช้เพื่อให้ระบุได้ง่ายว่าเป็นตัวแปร

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

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

$ unset FOO
$ echo $FOO

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

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

บางครั้ง คุณอาจมีเหตุผลที่จะเชื่อว่าตัวแปรถูกตั้งค่าโดยคุณหรือกระบวนการแล้ว หากคุณไม่ต้องการลบล้าง มีไวยากรณ์พิเศษในการตั้งค่าตัวแปรให้เป็นค่าที่มีอยู่เว้นแต่ค่าที่มีอยู่จะว่างเปล่า

สำหรับตัวอย่างนี้ สมมติว่า FOO ถูกตั้งค่าเป็น /home/seth/Documents :

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

เครื่องหมายทวิภาค :- สัญกรณ์ทำให้เกิด ประกาศ เพื่อเริ่มต้นเป็นค่าที่มีอยู่ หากต้องการเห็นว่ากระบวนการนี้ทำงานในลักษณะอื่น ให้ล้างตัวแปรแล้วลองอีกครั้ง:

$ unset FOO
$ echo $FOO

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

ส่งตัวแปรไปยังกระบวนการย่อย

เมื่อคุณสร้างตัวแปร คุณกำลังสร้างสิ่งที่เรียกว่า ตัวแปรภายในเครื่อง . ซึ่งหมายความว่าตัวแปรเป็นที่รู้จักในเชลล์ปัจจุบันของคุณและมีเพียงเชลล์ปัจจุบันของคุณเท่านั้น

การตั้งค่านี้เป็นข้อจำกัดโดยเจตนาของ ขอบเขต . ของตัวแปร . ตามการออกแบบ ตัวแปรโดยค่าเริ่มต้นจะพร้อมใช้งานในเครื่องเท่านั้น ในความพยายามที่จะแบ่งปันข้อมูลตามความจำเป็น หากคุณสร้างตัวแปรที่มีรหัสผ่านสำคัญเป็นข้อความธรรมดาอย่างโง่เขลา เป็นเรื่องดีที่รู้ว่าระบบของคุณไม่อนุญาตให้ใช้ remote shell หรือ rogue daemon (หรือสิ่งอื่นใดนอกเซสชันที่สร้างตัวแปร) เข้าถึงรหัสผ่านนั้น .

ใช้ตัวอย่างตั้งแต่ต้นบทความนี้เพื่อเปลี่ยนพรอมต์ของคุณ แต่จากนั้นเปิดเชลล์ใหม่ภายในเชลล์ปัจจุบันของคุณ:

$ PS1="% "
% bash
$

เมื่อคุณเปิดเชลล์ใหม่ ค่าใหม่ของ PS1 เป็นพรอมต์เริ่มต้นแทนที่จะเป็นพรอมต์ใหม่ของคุณ:โปรเซสลูกไม่รับค่าตัวแปรที่ตั้งค่าไว้ในพาเรนต์ หากคุณฆ่าโปรเซสลูก คุณจะกลับไปที่พาเรนต์เชลล์ และคุณจะเห็น PS1กำหนดเองของคุณ แจ้งอีกครั้ง:

$ exit
%

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

การเติมตัวแปร

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

$ FOO=123 bash
$ echo $FOO
123
$

การจัดเตรียมอาจเป็นเคล็ดลับที่มีประโยชน์เมื่อคุณเรียกใช้แอปพลิเคชันที่ต้องการตำแหน่งพิเศษสำหรับห้องสมุดบางแห่ง (โดยใช้ LD_LIBRARY_PATH ตัวแปร) หรือเมื่อคุณรวบรวมซอฟต์แวร์ด้วยคอมไพเลอร์ที่ไม่ได้มาตรฐาน (โดยใช้ CC ตัวแปร) เป็นต้น

การส่งออกตัวแปร

อีกวิธีหนึ่งในการทำให้ตัวแปรพร้อมใช้งานสำหรับกระบวนการย่อยคือ ส่งออก คีย์เวิร์ด คำสั่งที่สร้างขึ้นใน Bash การส่งออก คำสั่งขยายขอบเขตของตัวแปรหรือตัวแปรใดก็ตามที่คุณระบุ:

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

ในทั้งสองกรณี ไม่ใช่แค่เชลล์ย่อยที่มีสิทธิ์เข้าถึงตัวแปรในเครื่องที่ส่งผ่านหรือส่งออกไป แต่เป็นกระบวนการย่อยของเชลล์นั้น คุณสามารถเปิดแอปพลิเคชันจากเชลล์เดียวกัน และตัวแปรนั้นพร้อมใช้งานเป็นตัวแปรสภาพแวดล้อมจากภายในแอปพลิเคชัน

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